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>