簡體   English   中英

Spring開機 JPA一對一映射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM