JPA实体不受管理/关系不持久

时间:2013-06-17 08:58:05

标签: java spring jpa orm jboss

设置

我在JBoss 4.3.2上使用JPA 1.0,Spring 3.0.6和hibernate 3.2.1。有些EJB在某种程度上称为DAO,它试图持久化两个实体。

问题

结果非常意外:调用.persist(entity)后不管理实体。

有趣的是:一个非常相似的测试应用程序,它使用包含DAO的相同jar,Beans persistence.xml作为服务器应用程序,坚持一切都很好。调用.persist()后管理bean。

实体

我的班级SubscriberSubscriberState

@Entity
@Table(name = "subscriber")
public class Subscriber implements java.io.Serializable {

    // all the other stuff

    @ManyToOne
    @JoinColumn(name = "status")
    private SubscriberState state;

}

由于遗产原因,SubscriberState的关系为Subscriber

@Entity
@Table(name = "subscriber_state")
public class SubscriberState implements java.io.Serializable {

    // ...blah

    @ManyToOne
    @JoinColumn(name = "subscriber", nullable = false)
    private Subscriber subscriber;
}

我要做什么来坚持

现在我尝试坚持订阅者,它将不受管理,坚持():

 final Subscriber subscriber = new Subscriber();
 // set up...
 entityManager.persist(subscriber);
 entityManager.contaons(subscriber); //will yield FALSE

添加SubscriberState即可。但只有关系的一面将存储到DB:

SubscriberState subscriberState = new SubscriberState();
subscriberState.setSubscriber(subscriber);
entityManager.persist(subscriberState);
entityManager.merge(subscriber);

SubscriberState.setSubscriber看起来像这样:     public void setSubscriber(final Subscriber subscriber){          this.subscriber = subscriber;         subscriber.setState(本);     }

查看数据库会告诉我,SubscriberState知道它是Subscriber,但是订阅者不知道它是State

配置

这是(现已修改和删除)persistence.xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

             org.hibernate.ejb.HibernatePersistence         的java:JDBC / SODS

    <properties>
        <property name="hibernate.dialect" value="${db.hibernate.dialect}" />
        <property name="hibernate.validator.apply_to_ddl" value="false" />
        <property name="hibernate.validator.autoregister_listeners" value="false" />
        <property name="hibernate.cache.provider_class" value="org.jboss.ejb3.entity.TreeCacheProviderHook" />
        <property name="hibernate.treecache.mbean.object_name" value="jboss.cache:service=EJB3EntityTreeCache" />
        <property name="jboss.entity.manager.jndi.name" value="java:/SOEntityManager-${app.version}" />
        <property name="jboss.entity.manager.factory.jndi.name" value="java:/SOEntityManagerFactory-${app.version}" />
        <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory" />
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
    </properties>

    <class>com.stackoverflow.some.classes.i.cant.show.Here</class>

以下是我春天背景的相关部分:          

    <context:annotation-config />

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

    <jee:jndi-lookup id="entityManagerFactory" jndi-name="java:/SOEntityManagerFactory-${app.version}" />
    <jee:jndi-lookup id="entityManager" jndi-name="java:/SOEntityManager-${app.version}" />
    <jee:jndi-lookup id="soDataSource" jndi-name="java:jdbc/SODS" />

    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
        <constructor-arg ref="soDataSource" />
    </bean>

    <context:component-scan base-package="blah - secret" />
    <import resource="daoContext.xml" />
</beans>

任何想法,为什么这个配置不起作用?

2 个答案:

答案 0 :(得分:0)

我没有在您的DAO或服务层中看到@Transaction的使用

添加SubscriberState将起作用。但只有关系的一侧将存储到DB

您应该在

中使用级联选项
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "subscriber", nullable = false)
private Subscriber subscriber;

这将在持久操作中保存关系的两面

另外我看到的是两个单向关系,而不是一个bidireccional,尝试使用mappedBy

@ManyToOne
@JoinColumn(name = "status")
private SubscriberState state;

除非那不是您想要的,但您应该重新考虑您的设计以使OneToMany的一方和另一方的ManyToOne,使用mappedBy来定义关系的来源(所有者)

答案 1 :(得分:0)

这发生在我的应用程序,JPA和MySQL。在属性文件中加载适当的数据库驱动程序类。