オブジェクトをデータベースに永続化しようとしています。 「列IDはnull値エラーを受け入れることができません」を取得し続ける。私のオブジェクトは次のようになります:
@Entity
public class TestTable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id = 0;
@Column(nullable=false, length=256)
private String data = "";
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
私の永続化機能:
public static synchronized boolean persistObject(Object obj){
boolean success = true;
EntityManager em = null;
EntityTransaction tx = null;
try{
em = getEmf().createEntityManager();
tx = em.getTransaction();
tx.begin();
em.persist(obj);
tx.commit();
} catch (Exception e){
success = false;
} finally{
try{
em.close();
} catch(Exception e){
//nothing
}
}
return success;
}
GenerationType.TABLEを使用できます。そうすることで、jpaはIDの割り当てにシーケンステーブルを使用し、移植性を低下させるシーケンス値や自動インクリメント値やトリガーを生成する必要がなくなる可能性があります。
また、Java= int型はデフォルトで0で開始されるため、これも取り除くことができることに注意してください。
私の場合、それは悪い方言についてでした:
hibernate.dialect=org.hibernate.dialect.H2Dialect
の代わりに:
hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect
本番データベースに切り替えたとき。 Hibernateは、異なるdbエンジン用に準備された戦略を使用しようとしました。
私はあなたに似た症状の問題を抱えていました。結局、データベース接続の構成が間違っていることがわかりました。スキーマが正しくない古いデータベースに接続していました。新しいスキーマは主キー列を次のように宣言しました
"ID" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)
したがって、 データベース自体が主キーを自動的に生成した に対して、古いスキーマはそれを次のように宣言しました
"ID" INTEGER NOT NULL
Hibernateは新しいスキーマに対して正しいコードを実行しましたが、古いスキーマはSQL INSERT
にID
列の値を提供するよう要求したため、古いスキーマで失敗しました。
ID列がIntの場合、Hibernateはサイレントで不可解な方法で失敗します。コードではLongに、データベースでは符号なし64ビット整数に変更してみてください。これで問題が解決しました。
または、@GeneratedValue(strategy = GenerationType.AUTO)
ではなく@GeneratedValue(strategy = GenerationType.SEQUENCE)
で試してください。