gpt4 book ai didi

hibernate - Spring - hibernate : detached entity passed to persist

转载 作者:行者123 更新时间:2023-12-04 06:21:01 25 4
gpt4 key购买 nike

我有以下对象:

public class Constraint {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
int id;

String name;
String description;
String path;
int level;

@ManyToOne
@JoinColumn(name="parent_id")
Constraint parent;

@OneToMany
@JoinColumn(name="parent_id")
Set<Constraint> children;

@ManyToOne
@JoinColumn(name="type_id")
ConstraintType type; }

如您所见,此表表示树结构。具有以下功能:
public List<Constraint> getAllDescendantsOfConstraint(Integer id) {
StringBuilder sb = new StringBuilder();
sb.append("WITH RECURSIVE tree as ");
sb.append("( ");
sb.append(" select * from constraints where id = :id ");
sb.append(" union all ");
sb.append(" select a.* from constraints a, tree b where a.parent_id = b.id ");
sb.append(") ");
sb.append("select * from tree where id <> :id ");

Query q = entityManager.createNativeQuery(sb.toString(), Constraint.class);
q.setParameter("id", id);
return (List<Constraint>) q.getResultList();
}
@Transactional
public void setupPaths() {
Query q = entityManager.createQuery("from Constraint", Constraint.class);
@SuppressWarnings("unchecked")
List<Constraint> constraints = (List<Constraint>) q.getResultList();

for(Constraint c : constraints) {
List<Constraint> descendants = getAllDescendantsOfConstraint(c.getId());
for(Constraint d : descendants) {
String tpath;
if((tpath = d.getPath()) == null || d.getPath().equals(""))
tpath = String.valueOf(c.getId());
else
tpath = d.getPath() + "." + String.valueOf(c.getId());
d.setPath(tpath);
entityManager.persist(d);
}
}
}

如果调用 setupPaths 我得到一个“传递给持久异常的分离实体”。
如果不是 entityManager.persist(d);我愿意 :
d = entityManager.merge(d);
d.setPath(tpath);

什么都没有发生(数据没有保存在数据库中)。如果调用刷新,我也会将分离的实体传递给持久性异常。我怀疑这与我没有急切地加载 parent 或 child 有关?

编辑:经过进一步测试,因为上面看起来很可疑,似乎我从 entityManager 获得的每个实体,无论我如何获得它(无论是使用 em.find(MyObject.class,id 还是任何类型的查询)它都是分离的获取后!我从电话中看到了
em.contains(myObject)

总是返回false。问题是我在具有相同数据库服务器的其他 spring 项目上使用完全相同的设置,并且工作正常。

最佳答案

在(最终)打开 Hibernate 的调试信息后,我看到 EntityManager 在 fetch 之后立即关闭 session ,这是错误的,因为我使用的是 @Transactional 注释。最后似乎是 STS(springsource 工具套件)和 spring 配置的问题,特别是:

<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>

这应该是正确的 maven 设置
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.3.1</version>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>compile</id>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
<verbose>false</verbose>
<outxml>true</outxml>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<configuration>
<outxml>true</outxml>
<source>${java-version}</source>
<target>${java-version}</target>
</configuration>
</plugin>

应该注意编译时编织,但出了点问题。我使用的是插件 1.2,当我将其更改为 1.3.1 时,它神奇地工作了。

关于hibernate - Spring - hibernate : detached entity passed to persist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6565740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com