【问题标题】:Hibernate: prevent delete orphan when using merge();Hibernate:使用merge()时防止删除孤儿;
【发布时间】:2012-06-19 09:36:18
【问题描述】:

我有一个对象列表

@ManyToMany(Fetch=FetchType.Lazy)
@JoinTable(...inverseJoin....)
public list<objects> getList()

我可能不想在执行 dto.merge 时对其进行初始化。

Hibernate 会自动删除所有关系,即使我没有指定 delete_orphan。

我可以知道如何防止休眠删除孤儿又名关系吗?

目前我必须在进行合并之前从数据库中检索/设置列表。

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    列表是实体状态的一部分,因为实体是关联的所有者。

    因此,如果您合并一个在 bean 中没有任何内容的分离实体,您就是在告诉 Hibernate:这是该实体的新状态,它不再包含任何对象。 很明显,Hibernate 删除了实体和之前包含在列表中的对象之间的关联。

    我的猜测是你构造一个新的实体实例并将其传递给merge(),而不是从会话中获取实体,修改它,然后将此实例传递给merge():

    而不是做:

    SomeEntity e = new SomeEntity();
    e.setId(34L);
    e.setFoo("newFoo");
    e = session.merge(e);
    

    你应该这样做:

    SomeEntity e = session.get(SomeEntity.class, 34L);
    e.setFoo("newFoo");
    // if the entity is detached:
    e = session.merge(e);
    

    请注意,您的问题与删除孤儿无关。删除孤儿意味着:如果我删除了父子实体之间的关联,那么子实体本身应该被自动删除。

    【讨论】:

    • 变化来自视图层是一个模型,我有一个 dtoBuilder...我怎么知道哪些数据有变化?有没有很好的设计模式来管理这类问题?为什么hibernate不提供注解忽略合并?
    猜你喜欢
    • 2012-08-16
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2011-02-09
    • 2011-10-20
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多