自動増分値と手動値を混ぜることはお勧めできません。あなたの現在のシーケンスポイントが11になるように指示しても、データベースはどのように振舞うべきですか?値20のエントリを挿入しますか?シーケンスが20に達すると、ユニークな制約違反が発生します。これを防ぐには、生成されたシーケンス値が既存のエントリと競合していないことを確認する必要があります。再試行やロックなどの問題が発生する可能性があります。
あなたのモデルや要件を再考するために、なぜあなたは2番目の擬似IDですか?手動と自動の両方で記入することがなぜ可能なのでしょうか? この機能を主張する場合は、手動入力が自動生成されたものと衝突しないことを保証することができます。次に、実際のID列(Integer id)のカスタムIDジェネレータを作成し、generate
メソッドをオーバーライドすることで、IDの生成とは別に、擬似ID "(routeNumberId)の値もチェックできます。 null
の場合、DBに次の値を与えるように依頼することができます。ダミー実装怒鳴る:
@Override
public synchronized Serializable generate(SessionImplementor session, Object object) throws HibernateException {
Serializable result;
if (object instanceof Route) {
Route reoute= ((Route) object);
if (route.getid() != null) {
result = (Serializable) route.getId();
} else {
result = <GENERATE new ID(e.g. call super, etc)> ;
}
if (route.getRouteNumberId() == null) {
long autoIncrRouteId = <GENERATE new routeID,>
route.setRouteNumberId(autoIncrRouteId);
}
return result;
} else {
result = super.generate(session, object);
}
return result;
}
別のオプションは、エンティティ・リスナーを@PrePersist使用し、チェックおよび/またはそこシーケンスの呼び出しを行うことです。しかし、ほとんどのJPAプロバイダはエンティティリスナへの注入を完全にサポートしていないため、リスナーからEntity ManagerまたはJPAコンテキストにアクセスするのは難しい場合があります。手動のjndiルックアップを実行することもできますが、問題の価値がある場合は、まず達成しようとしていることを再考してください。
編集:機能IDジェネレータコード(ポストグル)。
@Override
public Serializable generate(SessionImplementor session, Object obj) throws HibernateException {
Connection connection = session.connection();
try {
Route route= ((Route) obj);
String seqName = "you_db_id_sequence";
PreparedStatement ps = connection.prepareStatement("SELECT nextval ('" + seqName + "') as nextval");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
int id = rs.getInt("nextval");
log.info("Generated order id {} ", id);
if (route.getRouteNumberId() == null) {
route.setrouteNumberid(id); //or call another sequence to get a different id
}
return Long.parseLong(code);
} else {
throw new IllegalStateException("could not generate new id");
}
} catch (SQLException e) {
log.error("Could not generate id!", e);
throw new HibernateException("Unable to generate id from Sequence");
}
return null;
}
何かをコードしようとしましたか? – msagala25
StackOverflowへようこそ達成しようとしていることに向かって努力を示すために、いくつかのコードを投稿する必要があります。これは、他のユーザーがあなたの質問に答えるのにも役立ちます。 –
私はそれを更新しました.. @SouravGhosh –