当前位置: 首页 > 知识库问答 >
问题:

我如何合并两个分别为equals()但不相同的分离实体?

雷曜灿
2023-03-14

我有一个实体设置,归结起来就是这样的:

Person (N:1) -> Job (1:N) -> Company
@OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Job> jobs = new LinkedHashSet<>();
@Entity
public class Company {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(nullable = false, unique = true)
    private String name;
    @OneToMany
    private List<Stelle> jobs = new ArrayList<Stelle>();

    public String getDisplayText() { return name; }
    @Override
    public int hashCode() {
        int result = 1;
        result = 31 * result
            + ((getDisplayText() == null) ? 0 : getDisplayText().hashCode());
        return 31 * result + ((getId() == null) ? 0 : getId().hashCode());
    }
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Company))
           return false;
        return !(getId() == null && ((Company) obj).getId() != null)
             || getId() == null
             || (getId().equals(((Company) obj).getId());
    }
    // getters + setters
}
Caused by: java.lang.IllegalStateException: Error occurred while storing 
  entity [example]. An entity copy [com.company.entity.Company#1] was already
  assigned to a different entity [example].
at org.hibernate.event.internal.EventCache.put(EventCache.java:192)     
at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:287)
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:153)
at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:851)
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:833)   
at org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:277)
[...]
if ( copyCache.containsKey( entity ) &&
        ( copyCache.isOperatedOn( entity ) ) ) {
    LOG.trace( "Already in merge process" );
    event.setResult( entity );
}
else { /* fetch entity and put it in copyCache */ }

copycache是一个java.util.IdentityHashMap,因此对于这个缓存,我的两个分离实体不被认为是相等的,即使它们是根据它们的equals()方法形成的。

我的问题很简单:我可以继续使用上面描述的流吗?或者我必须修改什么才能使Hibernate合并这个实体图?

编辑后添加:我知道Hibernate:一个实体副本已分配给另一个实体和IllegalStateException:存储实体 时出错,一个实体副本 已分配给描述类似问题的另一个实体

共有1个答案

计和顺
2023-03-14

我以前遇到过这样的问题,我在hibernate文件中使用了下面的代码:::

Session session = getSession();
if(pojo.id!=null){
   session.merge(pojo)
}
else{
    session.saveOrUpdate(pojo)
}

其中getSession()

public Session getSession() {
    Session session = getSessionFactory().getCurrentSession();
    if (session == null) {
        session = getSessionFactory().openSession();
    }
    return session;
}
 类似资料:
  • 我的两个方法中的操作是相同的,但是输入参数类型不同,那么我该如何优化这两个方法,似乎没有那么重复?因为它们的操作是相同的,但参数类型不同,我该怎么做才能使这段代码更优雅呢?

  • 问题内容: 我有两个相同的应用程序,分别在一个用于演示和一个用于开发的应用程序上运行。m使用redis数据库存储键值,我如何为这两个不同的应用程序分离redis数据库。m使用node.js作为Redis客户端。和m使用此https://github.com/mranney/node_redis/ redis客户端。 如何在节点中为同一应用程序分离redis数据库。 问题答案: 您可以在node_r

  • 问题内容: 我正在尝试将具有相同ID但具有不同列值的不同行合并为一个。 例如 : 我希望将其结合起来,这样结果是: 或者 或上述内容的任何其他变体,以使行以某种方式连接在一起。 任何帮助,将不胜感激!提前致谢。 问题答案: 请先阅读我的评论-除非仅用于报告目的,否则您甚至都不要考虑这样做,并且您想了解如何在普通SQL中做到这一点(而不是使用报告的正确解决方案)工具)。 第二种格式最简单,特别是如果

  • 问题内容: 我有桌子 表格1 和表2 我想将两个没有公用字段的表合并到一个表中,如下所示: 表3 即,就像将两个桌子并排放置。 我被卡住了!请帮忙! 问题答案: 为每个表中的每一行获取一个行号,然后使用这些行号进行完全连接: 这是假定SQL Server> = 2005。

  • 我的应用程序需要存储一组与另一个“真实”表具有相同数据库结构的“暂存数据”,但在人工查看暂存数据的内容之前,不能将其写入真实表。这些不仅是对实际表的添加,而且是对它的更新(因此,换句话说,在staging table中,有一些值与实际表具有相同的主键,因为它们引用了相同的实体实例)。 我的方法是让两个JPA对象具有相同的结构(即字段、列名等),但存储在不同的表中,并与Spring透视图完全分开处理

  • 本文向大家介绍两个对象值相同equals结果为true,但却可有不同的 hashCode,这句话对不对?相关面试题,主要包含被问及两个对象值相同equals结果为true,但却可有不同的 hashCode,这句话对不对?时的应答技巧和注意事项,需要的朋友参考一下 不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希值(hashCode)应当相同。Java 对于equals