2016-10-07 12 views
1

SQL Server Expressデータベースに偽のデータを挿入しようとしています。私は次のように上記のクラスを作成するには、エンティティ・マネージャを呼び出しJPAのIDENTITY_INSERT

@Entity 
@Table(name = "People") 
public class Peeps implements Serializable { 

    @Id 
    @Column(name = "ID", columnDefinition = "Decimal(10,0)") 
    private String id; 

    @Column(name = "PERSON_NAME") 
    private String name; 

} 

:私はこのようないくつかの簡単なコードを使用しています

private EntityManager em = createManager(); 
private EntityTransaction utx = em.getTransaction(); 

final Peeps entity = new Peeps(); 
entity.setId("10002"); 
entity.setName("Joe"); 
utx.begin(); 
em.persist(entity); 
utx.commit(); 

これを行うときしかし、私はエラーを取得する::

em.createNativeQuery("SET IDENTITY_INSERT People ON").executeUpdate(); 
em.persist(entity); 
em.createNativeQuery("SET IDENTITY_INSERT People OFF").executeUpdate(); 
:私はやってみましたので、何
Cannot insert explicit value for identity column in table 'People' when IDENTITY_INSERT is set to OFF 

はこのようなものです

しかし、私はまだ同じエラーが発生します。私の直感は、接続が共有されていないと私に信じさせる。冬眠を指示するために何かできることがありますか?IDENTITY_INSERTON私は持続性を呼び出す前に?

+0

エンティティの識別子を明示的に設定する必要があるのはなぜですか?また、データベースでそれを処理できるようにするだけの理由はありますか? – Naros

+0

@Naros正直なところ、私のロジックを見ても、私のエンティティは決して実動コードでデータベースに書き込まれません。したがって、デフォルト戦略では、データベースが手動で識別子を入力する必要があります。これを念頭に置いて、この@GeneratedValue(strategy = GenerationType.IDENTITY)をエンティティに追加して、テーブルがそのIDを生成し、コミットした後にそのIDをエンティティに戻すことができるようにしました。これは良い戦略だと思いますか? – angryip

+0

関連する議論http://stackoverflow.com/questions/25746509/hibernate-nativequery-transaction –

答えて

3

あなたのidフィールドの下に次の行が欠落しています

@GeneratedValue(strategy=GenerationType.IDENTITY) 

だからあなたのidフィールドは、次のようになります。

@Entity 
@Table(name = "People") 
public class Peeps implements Serializable { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name = "ID", columnDefinition = "Decimal(10,0)") 
    private String id; 

    @Column(name = "PERSON_NAME") 
    private String name; 

} 

第二には、あなたはあなたにIDを設定することになっていませんあなたがhibernateを使ってそれを永続させるとき、IDは自動的に生成されます。

ので取り除く:entity.setId("10002");

とちょうどこの操作を行います。何か他のものは、自動増分、あなたのDBテーブルの主キーを構成していることを確認してください

private EntityManager em = createManager(); 
private EntityTransaction utx = em.getTransaction(); 

final Peeps entity = new Peeps(); 
entity.setName("Joe"); 
utx.begin(); 
em.persist(entity); 
utx.commit(); 

を。

+1

生成された値の注釈を使用するのは、エンティティがidの正しい設定に関連するテーブルのみに依存しますか? – angryip

+0

私は –

+0

にテーブルがプライマリキーを割り当ててそれを返さなければならないことを何に頼んでいるのですか?ドキュメントを理解しようとすると、次のようになります。http://docs.oracle.com/javaee/5/api/javax/persistence/GenerationType.html#IDENTITY – angryip