7

JPA toplink-essentialSQL Server 2008を使用しています

私の目標は、テーブルに挿入されるデータの自動インクリメント主キー値を取得することです。JDBCでは、自動インクリメントプライマリIDのIDを提供するgetInsertedId()のようなメソッドがあります(ただし、insertステートメントが実行された後です)

JPAで、私@GenratedValue annotationはそのトリックを行うことができることを発見しました。

@Entity
@Table(name = "tableOne")
public class TableOne implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "tableId")
    private Integer tableId;

以下のコードを実行すると、自動インクリメントされたIDが返されますが、NULLが返されます...

 EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();
 EntityTransaction txn = em.getTransaction();
 txn.begin();

 TableOne parent = new TableOne();
 em.persist(parent); //here I assume that id is pre-generated for me.
 System.out.println(parent.getTableId()); //this returns NULL :(
4

3 に答える 3

11

問題は、IDENTITY ID 生成を使用していることです。IDENTITY ID 生成は、ID を生成するために INSERT を必要とするため、事前割り当てを行うことができません。TABLE および SEQUENCE ID 生成は事前割り当てをサポートしています。私は常にこれらを使用することをお勧めしますが、この問題とパフォーマンスのために IDENTITY を使用しないことをお勧めします。

IDENTITY ID 生成を使用する場合、flush() を呼び出して ID の生成をトリガーできます。

于 2011-02-02T15:16:10.353 に答える
6

これを行うだけです:

public void create(T entity) {
   getEntityManager().persist(entity);
   getEntityManager().flush();
   getEntityManager().refresh(entity);
}

エンティティを更新すると、ID フィールドに適切な値が表示されます。

于 2012-07-18T06:05:53.270 に答える
2

私たちはSQL Server 2008も使用していますが、うまくいかなかったので"SELECT @@IDENTY"、挿入されたIDを取得するために常に別のクエリを実行しています。

私がネットで見つけた理由は、自動ID(IDENTITY)がデータベースによって管理されており、行をコミットするか、データベースから情報を手動で取得しない限りエンティティにフェッチされないためです。

于 2011-02-02T09:31:11.113 に答える