Я сделал отображение POST myapp.com/users
в моем приложении Spring.Когда я отправляю данные в это отображение, мне нужно создать 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`);