0

設定

JBoss 4.3.2 で JPA 1.0、Spring 3.0.6、休止状態 3.2.1 を使用しています。ある時点で 2 つのエンティティを保持しようとする DAO を呼び出す EJB がいくつかあります。

問題

結果はまったく予想外です: .persist(entity) を呼び出した後、エンティティは管理されません

面白いことに、DAO を含む同じ jar ファイルである Beans persistence.xml をサーバー アプリケーションとして使用する非常によく似たテスト アプリは、すべてを問題なく保持します。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);

public void setSubscriber SubscriberState.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>

この設定が機能しない理由はありますか?

4

2 に答える 2

0

DAO またはサービス層で @Transaction が使用されていません

SubscriberState を追加すると機能します。ただし、関係の片側のみがDBに保存されます

カスケードオプションを使用する必要があります

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "subscriber", nullable = false)
private Subscriber subscriber;

これにより、永続操作で関係の両側が保存されます

また、私が見ているのは、1つの双方向ではなく、2つの単方向の関係です。mappedByを使用してみてください

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

それが望ましくない場合を除き、一方を OneToMany に、もう一方を ManyToOne にするように設計を再検討する必要がある場合は、mappedBy を使用して関係のソース (所有者) を定義します。

于 2014-02-01T01:17:45.913 に答える
0

これは、私のアプリケーション JPA with MySQL で発生しました。プロパティ ファイルに適切なデータベース ドライバ クラスをロードします。

于 2016-06-09T05:31:59.103 に答える