【问题标题】:Hibernate: One To Many Relation on cascade save but doesn't delete休眠:级联保存但不删除的一对多关系
【发布时间】:2012-01-21 21:08:52
【问题描述】:

我遇到了休眠问题。

简而言之:

当关系有属性并且需要级联保存、删除和更新时,如何配置与Hibernate的ManyToMany关联?

大尺寸:

想象以下数据库:

             Super      Mini
                 M______N
                     |
                     attribute

这里有3张桌子:

"Mini", "Super" and "Super_Mini".

现在想象 Super_Mini 有 1 个关系属性(显然还有键)。

好的,现在通过以下方式将其转换为 Hibernate:

 Super:
 // The relation is Many to Many, but considering that it has an attribute, this is OneToMany with the ManyMany RelationShip
 @OneToMany(mappedBy="mini", targetEntity=Mini.class)   
 @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE})    
 @LazyCollection(LazyCollectionOption.TRUE)
 private Set<SuperMini> superMini = new HashSet<SuperMini>();


 SuperMini:
 @Id    
 @ManyToOne(targetEntity=Super.class,fetch=FetchType.LAZY)  
 @Cascade({CascadeType.LOCK})   
 @JoinColumns({ @JoinColumn(name="...", referencedColumnName="...") })  
 private Super super;   

 @Id    
 @ManyToOne(targetEntity=Mini.class,fetch=FetchType.LAZY)   
 @Cascade({CascadeType.LOCK})   
 @JoinColumns({ @JoinColumn(name="...", referencedColumnName="...") })  
 private Mini mini;

所以,我认为配置是正确的,并且如果对象有Mini childrens,则独立保存所有这些。问题是当我尝试删除对象时:

 Super data = getHibernateTemplate().load(Super.class, idSuper);

 getHibernateTemplate().getSessionFactory().getCurrentSession().clear();

 data.setMini( new HashSet<Mini>() );

 getHibernateTemplate().delete( data );
 getHibernateTemplate().getSessionFactory().getCurrentSession().flush();

Hibernate 不删除 Mini 关系...有什么问题?我知道如何通过HQL解决,但可能配置不正确,我不知道。

提前谢谢你,

【问题讨论】:

    标签: java hibernate annotations cascade cascading-deletes


    【解决方案1】:

    你的问题不清楚。 Super 不包含 Set&lt;Mini2&gt;。它包含一个Set&lt;SuperMini2&gt;。所以最后一个代码 sn -p 没有多大意义。

    此外,Super.superMini2 上的 targetEntity 属性是不正确的,也是不必要的。

    CascadeType.ALL包含CascadeType.DELETE,所以也没有必要。

    但是要回答你的问题,我认为问题是删除Super 级联到SuperMini2 因为关联有级联删除,但是SuperMini2 和Mini2 之间没有级联删除,所以当然Mini2 实例是没有被删除。

    编辑:

    答案是,在编辑问题之前,OP 在删除 Super 实体之前从 SuperMini 集合中删除了所有实体。所以对 Supermini 集合的级联删除就没有什么可删除的了。

    【讨论】:

    • 感谢您的回答。 Super 不包含 Set,因为 Super 和 Mini2 之间的关系具有属性。当我删除一个 Super 时,必须删除 Super 和 Mini2 之间的关系(关系,而不是实体 Mini2)。
    • @JB Nizet,我在原线程中添加了下一条注释://关系是多对多,但考虑到它有一个属性,这是OneToMany与 ManyMany 关系
    • 请告诉我们用于删除超级实体的真实代码。你的代码中真的有那些 data.setMini2'new HashSet()) 吗?这个调用有什么作用?你为什么这样做?
    • 删除Entity Super的依赖我使用粘贴的代码,这是真正的代码。我为使用休眠级联删除设置了空集合。我认为问题在于 SuperMini2 类在 ManyToOne 关系中有标签 @Id ......但不知道:?再次感谢
    • 我已经简化了问题,但我还不知道答案:?
    猜你喜欢
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多