[英]Spring REST API - User + his profile persist
I made an POST mapping myapp.com/users
in my Spring App. 我在Spring App中进行了POST映射
myapp.com/users
。 When I send data to this mapping, I need create User
and his Profile
. 将数据发送到此映射时,需要创建
User
和他的Profile
。 Relation between them is OneToOne
. 它们之间的关系是
OneToOne
。 Example: 例:
AbstractEntity: AbstractEntity:
@MappedSuperclass
public abstract class AbstractEntity implements Serializable {
@Id
@GeneratedValue
private Integer id;
}
User: (Only important stuff) 用户:(仅重要内容)
@Entity
@Table(name = "Users")
public class User extends AbstractEntity {
@Basic(optional = false)
@Column(nullable = false, unique = true)
private String username;
@Basic(optional = false)
@Column(nullable = false)
private String password;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
private Profile profile;
public Profile getProfile() {
return profile;
}
public void setProfile(Profile profile) {
this.profile = profile;
}
}
Profile: (Only important stuff) 简介:(仅重要内容)
@Entity
@Table(name = "Profiles")
public class Profile extends AbstractEntity {
@Basic(optional = false)
@Column(nullable = false)
private String name;
@Basic(optional = false)
@Column(nullable = false)
private String surname;
@OneToOne
@JoinColumn(name = "USER_ID")
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
And my RestController: 还有我的RestController:
@RestController
@RequestMapping("/users")
public class UserController {
private static final Logger LOG = LoggerFactory.getLogger(UserController.class);
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
/**
* Registers a new user.
*
* @param user User data
*/
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Void> register(@RequestBody User user) {
try {
userService.persist(user);
LOG.debug("User {} successfully registered.", user);
final HttpHeaders headers = RestUtils.createLocationHeaderFromCurrentUri("/current");
return new ResponseEntity<>(headers, HttpStatus.CREATED);
}
catch (TransactionSystemException e) {
throw new PersistenceException(e.getOriginalException());
}
}
}
How can I send both User and Profile? 如何发送用户和个人资料?
@RequestBody
can receive only one Entity what I know. @RequestBody
只能接收我所知道的一个实体。 I tried this JSON data: 我尝试了以下JSON数据:
{
"username": "admin",
"password": "1234",
"profile":{
"name": "User",
"surname": "Test"
}
}
But even User and Profile are created, there is no relation between them (USER_ID not set). 但是,即使创建了用户和配置文件,它们之间也没有关系(未设置USER_ID)。
Here are the table definitions: 这是表定义:
CREATE TABLE `profiles` (
`ID` int(11) NOT NULL,
`BIRTHDATE` date DEFAULT NULL,
`DESCRIPTION` varchar(255) DEFAULT NULL,
`GENDER` varchar(255) DEFAULT NULL,
`IMAGE` varchar(255) DEFAULT NULL,
`NAME` varchar(255) NOT NULL,
`SURNAME` varchar(255) NOT NULL,
`USER_ID` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `sequence` (
`SEQ_NAME` varchar(50) NOT NULL,
`SEQ_COUNT` decimal(38,0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `sequence` (`SEQ_NAME`, `SEQ_COUNT`) VALUES
('SEQ_GEN', '50');
CREATE TABLE `users` (
`ID` int(11) NOT NULL,
`BLOCKED` tinyint(1) NOT NULL DEFAULT 0,
`EMAIL` varchar(255) NOT NULL,
`PASSWORD` varchar(255) NOT NULL,
`ROLE` varchar(255) DEFAULT NULL,
`USERNAME` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `profiles`
ADD PRIMARY KEY (`ID`),
ADD KEY `FK_profiles_USER_ID` (`USER_ID`);
ALTER TABLE `sequence`
ADD PRIMARY KEY (`SEQ_NAME`);
ALTER TABLE `users`
ADD PRIMARY KEY (`ID`),
ADD UNIQUE KEY `EMAIL` (`EMAIL`),
ADD UNIQUE KEY `USERNAME` (`USERNAME`);
ALTER TABLE `profiles`
ADD CONSTRAINT `FK_profiles_USER_ID` FOREIGN KEY (`USER_ID`) REFERENCES `users` (`ID`);
I assume you have an attribute annotated with @Id . 我假设您有一个用@Id注释的属性。 You have to add the mappedBy to the owner of the relationship, in your case User .
您必须将mappingBy添加到关系的所有者,在这种情况下为User 。 Try the following modifications
尝试以下修改
@Entity
@Table(name = "Users")
public class User extends AbstractEntity {
@Basic(optional = false)
@Column(nullable = false, unique = true)
private String username;
@Basic(optional = false)
@Column(nullable = false)
private String password;
//Edited here
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
private Profile profile;
public Profile getProfile() {
return profile;
}
public void setProfile(Profile profile) {
this.profile = profile;
}
}
And 和
@Entity
@Table(name = "Profiles")
public class Profile extends AbstractEntity {
@Basic(optional = false)
@Column(nullable = false)
private String name;
@Basic(optional = false)
@Column(nullable = false)
private String surname;
//Edited here
@OneToOne
@JoinColumn
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.