2016-03-21 13 views
0

を保持されません。Glassfishのエンティティが、私はPostgreSQLのテーブルおよびシーケンスを作成

CREATE SEQUENCE 
    test_id 
INCREMENT 1 
START 1 
MAXVALUE 500; 
CREATE TABLE TEST(
    id    NUMERIC PRIMARY KEY DEFAULT NEXTVAL('test_id'), 
    name    TEXT NOT NULL UNIQUE, 
    name2    TEXT DEFAULT NULL 
); 

それから私は、Eclipse内のエンティティを生成します。

@Entity 
@NamedQuery(name="Test.findAll", query="SELECT t FROM Test t") 
public class Test implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private long id; 
    private String name; 
    private String name2; 

    public Test() { 
    } 


    @Id 
    @SequenceGenerator(name="TEST_ID_GENERATOR", sequenceName="TEST_ID", allocationSize=1) 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TEST_ID_GENERATOR") 
    public long getId() { 
     return this.id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 


    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 


    public String getName2() { 
     return this.name2; 
    } 

    public void setName2(String name2) { 
     this.name2 = name2; 
    } 

} 

それから私は、サーブレットから表に私のエンティティを記述しよう:

プロジェクトを展開してそのサーブレットを使用すると、ログは表示されません。プロジェクトはデプロイサーブレットです。ブラウザでは、私が参照してください:Served at: /Tetsが、私はテーブルをチェックすると、そこに私のエンティティが表示されません。私は間違って何をしていますか?

+0

'em.flush()' 'em.persist(..)の後に' – Jens

+0

私は追加して、キャッチjavax.persistence.TransactionRequiredException追加: 例外説明:いいえ外部管理トランザクションをあなたがする必要はありこのスレッド – JugerJuger

+0

のために、現在アクティブでありますトランザクションマネージャーを設定してください – Jens

答えて

0

簡単な答え:アプリケーション管理のEntityManagerを誤用する。

Java EE環境でEntityManagerをインジェクトすると、EntityManagerはIoCコンテナによって制御されます(ほぼ常にEJBまたはCDIです)。コンテナは、トランザクションのメカニズム時に手動の操作が不要な作りのビジネスメソッド呼び出しでトランザクションの伝播と境界を処理します。あなたが代わりのEntityManagerFactoryを注入すると

@PersistenceContext 
private EntityManager em; 
... 
@TransactionAttribute(REQUIRES_NEW) 
public void someMethod(Bean b) { 
    em.persist(b); 
} // Transaction gets committed and em gets flushed with no extra work 

、全ての魔法が消えてしまいます。そのような場合は、トランザクションバインディングを手動で実行する必要があります。あなたはそれについて何もしません。それがTransactionRequiredExceptionを得る理由です。元の例では、アクティブなトランザクションがなくてもフラッシュが行われないため何もスローされないため、変更は黙って無視されます。これには、次のようになります。このシナリオでは

@Resource 
private UserTransaction t; 
... 
t.begin(); 
emf.createEntityManager().persist(bean); 
t.commit(); 

を私はEMのスレッド危難を維持するために、いくつかのステートレス豆と一緒にEntityManagerの注入を使用することにより、業界のベストプラクティスを活用するためにあなたをお勧めします。次に、このサーブレットにEJBを注入し、必要な処理を行います。

もう1つの方法は、UserTransactionを注入し、begin()メソッドを明示的に呼び出すことです。 UserTransactionはスレッドセーフであると宣言されていないので、その使用法の周りにある種の同期が必要です。これは間違いなくすべてのパフォーマンスを殺すので、最初のオプションに戻すことをお勧めします。

関連する問題