Hibernate级联儿童

时间:2015-08-12 19:50:09

标签: java hibernate jpa spring-data-jpa

我使用 Hibernate和spring数据来使用oracle DB管理我的实体

我有以下实体

@Entity
@Table(name = "user")
public class User {    
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
    @NotNull
    private String title;
}

和另一个

@Entity
@Table(name = "user_detail")
public class UserDetail {    
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
    private String address;
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}

我想在删除用户时删除子项'用户详细信息'(级联) 如何用hibernate解决这个问题

2 个答案:

答案 0 :(得分:2)

为了执行级联,您必须在代码中进行一些更改。

首先,您必须在User实体中映射UserDetail并在关系注释中包含级联设置:

@Entity
@Table(name = "user")
public class User {    
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    @NotNull
    private String title;

    @OneToOne(mappedBy="user", cascade=CascadeType.ALL)
    private UserDetail detail;
}

PS:我假设一对一的关系,但可以随心所欲地映射...所有hibernate的关系注释都支持级联。也支持映射的集合。

通过执行此操作,您告诉Hibernate在对User实体执行操作时执行级联。如果您想确切地告诉它必须执行级联的操作,您可以这样做:

@Entity
@Table(name = "user")
public class User {    
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    @NotNull
    private String title;

    @OneToOne(mappedBy="user", cascade={CascadeType.PERSIST, CascadeType.DELETE})
    private UserDetail detail;
}

您可以在Hibernate文档中找到所有CascadeTypes。请注意,为了执行级联,您应该避免使用休眠会话"更新","保存"和" saveOrUpdate"方法......你应该使用"坚持"和"合并"。

答案 1 :(得分:0)

解决方案是添加On Delete注释'@OnDelete(action = OnDeleteAction.CASCADE)' 关系之上如下:

@Entity
@Table(name = "user_detail")
public class UserDetail {    
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
    private String address;
    @ManyToOne
    @JoinColumn(name = "user_id")
    @OnDelete(action=OnDeleteAction.CASCADE)
    private User user;
}