我有一个实体设置,归结起来就是这样的:
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:存储实体
我以前遇到过这样的问题,我在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