Spring-hibernate:分离的实体传递给持久化
我的目标如下:Spring-hibernate:分离的实体传递给持久化,hibernate,spring,jpa,Hibernate,Spring,Jpa,我的目标如下: 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="paren
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; }
没有发生任何情况(数据未保存在数据库中)。若调用刷新,我也会将分离的实体传递给持久化异常。我怀疑这与我没有急切地向父母或孩子们施加压力有关
编辑:在进一步测试之后,因为上面的内容看起来很可疑,所以似乎我从entityManager获得的每个实体,无论我如何获得它(使用em.find(MyObject.class,id或任何类型的查询),它都会在获取后立即分离!我从调用
em.contains(myObject)
它总是返回false。问题是,我在具有相同数据库服务器的其他spring项目上使用了完全相同的设置,结果很好。之后(最终)打开Hibernate的调试信息时,我看到EntityManager在获取后立即关闭会话,这是错误的,因为我使用的是@Transactional annotation。最后,似乎STS(springsource toolsuite)和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>
org.codehaus.mojo
aspectj maven插件
1.3.1
org.aspectj
aspectjrt
${org.aspectj版本}
org.aspectj
aspectjtools
${org.aspectj版本}
编译
${java版本}
${java版本}
假的
真的
org.springframework
春季方面
编译
真的
${java版本}
${java版本}
我应该注意编译时的编织,但是出了点问题。我当时正在使用插件1.2,当我把它改成1.3.1时,它神奇地工作了
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
<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>