2016-08-09 11 views
2

persist()の後にデータベースが生成するIDを取得する必要があります。コードの次の部分を実行する際にHibernateでpersistの後にデータベース生成IDを取得する

@Entity 
@Table(name = "TableName") 
public class TableNameClass { 

    @Id 
    @Generated(GenerationTime.INSERT) 
    @Column(name = "ID", insertable = false, nullable = false, unique = true, updatable = false) 
private int ID; 

    ... 
} 

しかし、実体はDBに保存されているが、System.out.printlnの結果は0である:

Session s = HibernateUtil.getSessionFactory().openSession(); 
TableNameClass tnc = new TableNameClass(); 
tnc.setName("SessionTest4"); 
Transaction t = s.beginTransaction(); 
s.save(tnc); 
t.commit(); 
System.out.println(tnc.getID()); 
s.close(); 

誰も私を助けてもらえ私のエンティティは、このようになります、 お願いします?

PD:セッションやEntityManagerを使用しても構わないので、いずれかのソリューションが問題ありません。

編集:私はflush()save()後にメソッドを追加しようとしたが、き

まだ動作しません:

Session s = HibernateUtil.getSessionFactory().openSession(); 
AlertType at = new AlertType(); 
at.setName("SessionTest4"); 
Transaction t = s.beginTransaction(); 
s.save(at); 
s.flush(); 
t.commit();   
System.out.println(at.getID()); 
s.close(); 

私もcommit()flush()機能を追加しようとしました、しかし、トランザクションがアクティブではないという例外がスローされます。

答えて

1

あなたは解決策を持っています。私はそれらの両方が同じであるかどうかはわかりませんが、うまくいきます。

1

あなたは、データを同期させるために、エンティティ・マネージャを強制的に

em.flush(); 

を追加する必要があります。その後、at.getID()が値を返します。あなたが見ることができるように、私は@GeneratedValue(strategy = GenerationType.IDENTITY)ため@Generated注釈を変更した

@Entity 
@Table(name = "TableName") 
public class TableNameClass { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID", insertable = false, nullable = false, unique = true, updatable = false) 
    private int ID; 

    ... 
} 

CREATE FUNCTION

TableNameClass tnc = new TableNameClass(); 
tnc.setName("Solution"); 
Session s = HibernateUtil.getSessionFactory().openSession(); 
Transaction t = s.beginTransaction(); 
Integer myID = (Integer)s.save(tnc); 
t.commit(); 
s.close(); 
System.out.println(myID); 

ENTITY:ここ

+0

まだ動作しません。私が行った変更で質問を更新しました。何か案が?私はHibernate 5.2.4を使用しています。最終 –

+0

コミットはトランザクションを終了し、CMPを使用している場合は必要ありません。それを取り出し、それが動作するかどうかを確認します。 – WPrecht

+0

まだ動作しません。私はpersist()を削除しましたが、依然として0を返します。このチュートリアル[link](http://www.journaldev.com/3481/hibernate-session-merge)に従って、トランザクションなしでエンティティを保存してみました。 -vs-update-save-saveorupdate-persist-example)と自動コミットプロパティを有効にしていますが、これはHibernateの最新バージョンではこれ以上動作していないと思います。 –

関連する問題