在hibernate中删除多个关系

时间:2014-11-08 09:53:18

标签: java mysql hibernate

我的实体:

@Entity
public class User{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "userId")
    private Long id;
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private List<UC> owned = new ArrayList<UC>();
}

@Entity
public class UC{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @JoinColumn(name = "ukId")
    private Long id;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "userId")
    private User user;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "catId")
    private Cat cat;
}

@Entity
public class Cat{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "catId")
    private Long id;
    @OneToMany(mappedBy = "cat", cascade = CascadeType.ALL)
    private List<UC> owned = new ArrayList<UC>();
}

所以这是我的问题,其实很少。

问题#1:

我删除了一个Cat对象,我在Cat的拥有列表中设置了cascadeType.All,所以当我删除Cat对象时,所有在UC中使用Cat的记录都将被删除,但是我得到“删除的对象将被重新保存通过级联“,这是因为我在UC中有另一种关系,用户将UC存储在列表中。当我从UC中删除Cat对象和记录时,我不想删除User对象,因此在UC中的@ManyToOne上设置级联是禁止的。我该怎么办呢?在删除Cat之前,我应该从用户拥有列表中删除所有UC实例吗?我在UC中的关系比在此处显示的更多,如果是这种情况我也必须从其他列表中删除实例。

问题#2:

类似的情况,但我得到了常规的多对多关系我想删除连接表记录而不删除关系的另一面。

1 个答案:

答案 0 :(得分:0)

这是我的解决方案。 首先,我将以这种方式在OneToMany协会上设置孤儿删除。

@OneToMany(mappedBy = "cat", cascade = CascadeType.ALL, orphanRemoval = true)

然后,假设您要删除用户u和Cat c。此代码应该可以正常运行

    // Remove a cat and update the other entities
    Session s = sessionFactory.openSession();
    s.beginTransaction();
    s.delete(c);
    for (UC uc : c.getOwned())
        uc.getUser().getOwned().remove(uc);
    s.update(u);
    s.getTransaction().commit();
    s.close();