设置
我在 JBoss 4.3.2 上使用 JPA 1.0、Spring 3.0.6 和休眠 3.2.1。有一些 EJB 在某些时候调用 DAO 来尝试持久化两个实体。
问题
结果出乎意料:调用 .persist(entity) 后,实体不再被管理。
有趣的是:一个非常相似的测试应用程序,它使用与服务器应用程序相同的包含 DAO、Beanspersistence.xml 的 jar,可以很好地保存所有内容。调用后管理 bean .persist()
。
实体
我有一堂课Subscriber
有SubscriberState
.
@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;
}
我做什么来坚持
现在我尝试持久化一个订阅者,它将在 persist() 之后不受管理:
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(最终订阅者订阅者){ this.subscriber = 订阅者;订阅者.setState(this); }
查看数据库告诉我,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>
任何想法,为什么这个配置不起作用?