天天看點

Hibernate @OneToOne 自動新增和删除

版權聲明:本文首發 http://asing1elife.com ,轉載請注明出處。 https://blog.csdn.net/asing1elife/article/details/82811799

Hibernate建立一對一關系時兩張表主表保持一緻則可以實作自動新增和删除

更多精彩

主表配置

  1. 主表對應類中需要通過**@OneToOne**來表示其與從表的關系
@Entity
@Table(name = "sys_user")
public class User {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Long id = new Long(0);

    @OneToOne(cascade = {CascadeType.ALL}, mappedBy = "user", fetch = FetchType.LAZY)
    @JsonIgnore
    private UserAccount userAccount;

    public UserAccount getUserAccount() {
        return userAccount;
    }

    public void setUserAccount(UserAccount userAccount) {
        this.userAccount = userAccount;
    }
}
                

從表配置

  1. 從表中的id需要通過**@GeneratedValue和@GenericGenerator**來指明該值從主表中擷取
  2. 從表中同時需要通過**@OneToOne**來表示其與主表的關系
    • 在維護與主表關系中需要通過**@PrimaryKeyJoinColumn**來表示兩個表是主鍵關聯,不存在多餘外鍵
@Entity
@Table(name = "sys_user_account")
public class UserAccount {
    @Id
    @GeneratedValue(generator = "generator")
    @GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "user"))
    private Long id = 0L;

    @OneToOne(fetch = FetchType.LAZY)
    @PrimaryKeyJoinColumn
    private User user;

    public UserAccount() {
    }

    public UserAccount(User user) {
        this.user = user;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}
                

儲存操作

  1. 主表在執行儲存操作時,需要将從表注入其中,同時将主表的引入也注入到從表,才能實作兩個對象的雙向關聯
  2. 當主表的id自增成功時,由于從表保有對主表的引用,是以也可以得到主表的id
public void save(User user) {
    if (user.isNew()) {
        user.setUserAccount(new UserAccount(user));

        super.save(user);
    } else {
        super.save(userModel);
    }
}