EclipseLink 不删除私有的一对多项目

Posted

技术标签:

【中文标题】EclipseLink 不删除私有的一对多项目【英文标题】:EclipseLink not removing privately owned one-to-many item 【发布时间】:2011-11-08 19:40:20 【问题描述】:

我无法让 Eclipselink 删除映射为一对多关系的私有实体。当我从一对多集合中删除私有实体并将对其父级的引用设置为 NULL 然后保存父级时,私有实体不会从数据库中删除。但是,它已从对象中移除,并且在会话的剩余时间内,私有实体似乎实际上已被移除。

这是一个映射

@OneToMany(mappedBy="parent", cascade=CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH, fetch=FetchType.EAGER)
@PrivateOwned // should prevent orhpans, but doesn't.
List<PrivatelyOwnedEntity> privatelyOwnedEntities;

我尝试添加所有级联,还添加了@CascadeOnDelete,以及它们的每一种组合,人们认为这不会产生影响,但事实并非如此。

另一边:

@ManyToOne
private Parent parent;

我尝试添加 JoinColumn(nullable=false) 并删除 @ManyToOne 注释,以及这些注释的存在/删除的每个组合。这些更改都没有任何影响。

删除代码:

public boolean removePrivatelyOwnedEntity(int i) 
    PrivatelyOwnedEntity privatelyOwnedEntityToBeRemoved = this.privatelyOwnedEntities.get(i);
    //privatelyOwnedEntityToBeRemoved.setParent(null); 
    return this.privatelyOwnedEntities.remove(privatelyOwnedEntityToBeRemoved );

更新代码:

projectManager.saveProject(project);
//so this privatelyOwnedEntity is deep within this object.
// Its project.site.siteMap.parents.privatelyOwnedEntities.
// SiteMap is embedded in Site.
// On save it calls a dao, and the dao's abstract class handles the update
// as shown below using Springs JpaTemplate

保存代码:

public T save(T object) 
    return getJpaTemplate().merge(object);

【问题讨论】:

你能显示用于在父级中读取的代码,进行更改并持久化吗? 当然,我在上面添加了附加代码 【参考方案1】:

是对象id的父部分吗?

尽量不要将 parent 设置为 null,您不应该对私有对象执行此操作,只需将它们从集合中删除即可。

【讨论】:

感谢您的回复。不幸的是,这并没有奏效。还有其他想法吗?我不确定您所说的“是对象 id 的父部分”是什么意思私有实体对 id 使用身份策略。 @GeneratedValue(strategy=GenerationType.IDENTITY)

以上是关于EclipseLink 不删除私有的一对多项目的主要内容,如果未能解决你的问题,请参考以下文章

带有@EmbeddedId 和@Embeddable 的EclipseLink 组合键

删除具有一对多关系的实体

JPA 从 EclipseLink 到哪个提供商?

CoreData不删除对象一对多实体

一对多删除对象不删除多个实体上的对象

NHibernate 级联删除不适用于一对多关联