[英]Spring boot JPA One to One Mapping
我有兩個實體如下:
用戶實體
@Entity
@Table(name = "user")
@Getter
@Setter
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id")
private UserDetails userDetails;
@Column(name = "description")
private String description;
public User(final String description) {
this.description = description;
}
}
用戶詳細信息實體
@Entity
@Table(name = "user_details")
@Getter
@Setter
@NoArgsConstructor
public class UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "description")
private String description;
@OneToOne(mappedBy = "userDetails")
private User user;
public UserDetails(final String description) {
this.description = description;
}
}
我的飛行路線腳本如下:
CREATE TABLE `user` (
`id` int PRIMARY KEY AUTO_INCREMENT,
`description` varchar(255)
);
CREATE TABLE `user_details` (
`id` int PRIMARY KEY AUTO_INCREMENT,
`user_id` int,
`description` varchar(255)
);
ALTER TABLE `user_details` ADD FOREIGN KEY (`user_id`) REFERENCES `user` (`id`);
當我啟動應用程序時,表格創建良好。 我希望用戶表成為父表,而 user_details 表成為創建得非常好的子表。 但是當我在數據庫中插入一個用戶時,user_details 表中的 user_id 列存儲為 null。下面是我的 controller。
用戶控制器
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/users/{id}")
public ResponseEntity < User > getUser(@PathVariable("id") Long id) {
User user = userRepository.getOne(id);
return new ResponseEntity < > (user, HttpStatus.OK);
}
@PostMapping("/users")
public ResponseEntity < User > saveUser(@Valid @RequestBody User user) {
User userSaved = userRepository.save(user);
return new ResponseEntity < > (userSaved, HttpStatus.OK);
}
}
用戶資料庫
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
為什么 user_details 表中的 user_id 列存儲為 null?
下面是我的curl:
curl - X POST\
http: //localhost:5000/users \
-H 'Cache-Control: no-cache'\ -
H 'Content-Type: application/json'\ -
H 'Postman-Token: 22a98f2b-d3cc-4127-b3ad-35f28c916fa4'\ -
d '{
"description": "Some user",
"userDetails": {
"description": "Some user details"
}
}
您的映射不合適。 關系的所有者是UserDetails
。 所以關系應該出現在UserDetails
實體中。
找到下面添加的映射。
用戶實體
@Entity
@Table(name = "user")
@Getter
@Setter
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
private UserDetails userDetails;
@Column(name = "description")
private String description;
public User(final String description) {
this.description = description;
}
}
用戶詳細信息實體
@Entity
@Table(name = "user_details")
@Getter
@Setter
@NoArgsConstructor
public class UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "description")
private String description;
@OneToOne
@JoinColumn(name = "user_id")
private User user;
public UserDetails(final String description) {
this.description = description;
}
}
在某些情況下,您希望在實體之間保留一些共同的細節。 例如,您有一張表DepartmentUser
和其他User_address
,還有一張表ManagementUser
,在此表中您還需要 map 用戶地址,因為這兩種類型的用戶都有地址,在這種情況下您可能希望使用關聯! 但是 Hinbernate 確實有一個很棒的功能,稱為Embedding entity
。 您可以簡單地將用戶地址嵌入到您需要放入的每個實體中。
這可以通過這種方式完成。
@Entity
class DepartmentUser{
@Id
@GeneratedValues(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String eamil;
@Embedded
private UserAddress address;
//Standard setters and getters
}
另一張表用戶地址
@Embaddable
class UserAddress{
private String state;
private int zip;
private String country;
//Standard setters and Getters
}
這將只是 append 您的 Department User DB 和 UserAddress 中的列,這也會帶來良好的性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.