有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate删除多对多惰性集合

我的实体类是:

@Entity
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false)
    private Long id;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "dt_creation", nullable = false)
    private Date dtCreation;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "dt_maj", nullable = false)
    private Date dtMaj;

    // bi-directional many-to-one 
    @OneToMany(mappedBy = "quality", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<RQulityUser> RQualityUser;


@Entity
public class RQualityUser implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "dt_creation", nullable = false)
    private Date dtCreation;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "dt_maj", nullable = false)
    private Date dtMaj;

    // bi-directional many-to-one association to Questionnaire
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "fk_user", updatable = false, nullable = false)
    private User user;

    // bi-directional many-to-one association to QualitePersonne
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "cd_quality_user", updatable = false, nullable = false)
    private Quality quality;

当我得到一个用户并试图清除RQualityUser列表时,我不工作:

 User user = em.getByid(11);
 user.getRQualityUserList().clear();

Hibernate不删除关系表中的记录吗


共 (2) 个答案

  1. # 1 楼答案

    “延迟加载”意味着只有当您第一次实际访问某个实体时,才会加载该实体

    当你这样做的时候

    user.getRQualityUserList() // Still contains nothing.
    

    所以您正在清除空列表,然后当您将使用它时,将从DB调用数据

  2. # 2 楼答案

    如果你这样做

    User user = em.getByid(11);
    user.getRQualityUserList().clear();
    

    对于打开的持久上下文和事务内部,Hibernate应该删除记录

    如果你没有交易,你应该使用它

    如果使用封闭的持久上下文执行clear(),则应更新user以删除记录