4

编辑:修改问题以更好地反映问题。最初在这里发布问题

我有一个父 ( Context) 和一个子 ( User) 实体(ManyToOne 关系)。父级上的级联“删除”不会删除子级。代码如下:

//Owning side - child
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column(name = DBColumns.USER_NAME)
    private String name;
    @ManyToOne
    @JoinColumn(name = DBColumns.CONTEXT_ID)
    private Context context;
}

//parent
@Entity
public class Context {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column(name = DBColumns.CONTEXT_NAME)
    private String name;
    @OneToMany(mappedBy = "context", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE, orphanRemoval = true)
    private Set<User> users = new HashSet<User>();
}

//usage
Context sampleContext = new Context("sampleContext");
em.persist(sampleContext);
User sampleUser = new User(sampleContext, "sampleUser");
em.persist(sampleUser);
em.remove(sampleContext); //should remove user as well but throws foreign key dependency error
4

3 回答 3

3

我需要在删除实体之前刷新它:

em.refresh(sampleContext);
em.remove(sampleContext);

早些时候,被删除的实体 ( sampleContext) 不知道sampleUser与之关联的实体(可能是因为sampleContext从缓存中获取)。执行refreshbeforedelete可确保从数据库更新实体。

于 2013-04-12T07:23:11.980 回答
1

您在 sampleUser 而不是 sampleContext 上调用 remove(),并且 User 不会将 remove 级联到 Context,因此您应该只看到被删除的 User。

如果您在 sampleContext 上调用 remove(),您还必须确保在创建用户时将用户添加到上下文的用户中。您很可能只设置用户的上下文。

于 2013-04-10T13:34:24.727 回答
0

不要将您的关系表映射为实体。使用@ManyToMany相反并使您的用户实体成为关系的所有者。

编辑 :

所以你的关联表主键必须由两个外键组成。

请参阅此http://giannigar.wordpress.com/2009/09/04/mapping-a-many-to-many-join-table-with-extra-column-using-jpa/

于 2013-04-09T18:28:12.030 回答