我在Spring App中进行了POST映射myapp.com/users
。将数据发送到此映射时,需要创建User
和他的Profile
。它们之间的关系是OneToOne
。示例:
AbstractEntity:
@MappedSuperclass
public abstract class AbstractEntity implements Serializable {
@Id
@GeneratedValue
private Integer id;
}
用户:(仅重要的内容)
@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;
}
}
个人资料:(仅重要内容)
@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;
}
}
还有我的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());
}
}
}
如何发送用户和个人资料? @RequestBody
只能接收我所知道的一个实体。我尝试了以下JSON数据:
{
"username": "admin",
"password": "1234",
"profile":{
"name": "User",
"surname": "Test"
}
}
但是即使创建了用户和个人资料,它们之间也没有关系(未设置USER_ID)。
这是表的定义:
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`);
答案 0 :(得分:2)
我假设您具有一个用 @Id 注释的属性。 您必须将mapedBy添加到关系的所有者(在您的情况下为 User )。尝试以下修改
@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;
}
}
和
@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;
}
}