私は、Oracle XE 10g、Hibernate 3.5、JPA 2.0の設定をしています。挿入時にデータベース・トリガーによって生成される主キーを持つシンプルな表があります。トリガはシーケンスから値を取得します。トリガー/シーケンスの構成はOracle XEによって行われました。トリガーによって値が生成された場合、Id列に注釈を付けるにはどうすればよいですか?
実際の質問は次のとおりです。EntityManager.persistの後に、自分のエンティティでIdの現在の値を取得するにはどうすればよいですか?
私が試み:
@Id
private long id;
- > idは0
です。
@Id
@Generated(GenerationTime.ALWAYS)
@Column(insertable = false, updatable = false)
private long id;
- > idは0
です。
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
- > Hibernateが(存在しない)シーケンスを直接照会しようとしているため、失敗します。
最初の2つのアプローチではIDがデータベースに生成されますが、私のオブジェクトには値がありません。
ありがとうございますが、トリガーは増分するPK値を自動的に生成するOracleの方法です。私がそれを取り除くと、私はデータベースに直接クエリで簡単に行を挿入する可能性が失われます。第二に、あなたの提案のように注釈を付けると、単体テストのためにDerbyに簡単に切り替えることはできません。(... DBが生成したものだけを取るというアノテーションが必要です。 – Zeemee
これをグーグルで詳細な調査に基づいて、他のユーザーがHibernateからOracleのシーケンスを参照して成功しているように見えます。例を示します:https://forum.hibernate.org/viewtopic.php?p=2442821 Derbyの問題については、 – atrain
@Mulmoth:行を一意に識別する別のフィールドがない限り、Hibernateはどのようにしてその行を取得するのでしょうか?つまり、挿入されたばかりの行を識別する唯一の方法はIDであり、それはわからないからです。つまりIDを取得するにはIDが必要です。トリガーは本当に悪い考えです。 –