2017-02-21 21 views
0

です。私は正しく英語を話さないので、間違いをおかけして申し訳ありません。最初に挿入されたIDに割り当てられたIDが残っているのは、

エンティティを作成しようとすると(ID NULLでデータベースが割り当てます)、作成に失敗すると、エンティティには生成されたIDが残ります。私は、私のサービスで、エンティティが "保存"メソッドに渡されたかどうかをチェックし、IDを含んでいるかどうかをチェックして、更新または作成を行うため、IDが作成に失敗した場合はnullを残す必要があります。

作成に失敗した場合はIDを設定できますが、より複雑なトランザクションを作成する場合は、すべてのエンティティのすべてのIDを手動で変更するのが難しく、一部のオブジェクトはデータベースからフェッチされます。

私は正しく説明したと思います...ありがとう。

PD:これは

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name = "id") 
private Integer id; 

PD2 ...エンティティのフィールドIDです:私は途中でSpringフレームワークを使用しました。

EDIT:私はPostgreSQLを使用していて、世代ごとに試してみます。

答えて

2

デザインの観点から、null値ではない例外を使用する必要があります。

サービスでは、例外をキャッチするだけでif文を追加する必要はありません。

0

多くの場合、使用しているDB、生成方法、およびHibernate Dialectによって異なります。

多くの状況で、DBはIDを割り当て、Hibernateはその値でフィールドをロードします。

dialectとPostgresの両方を少し見れば、Postgresシーケンスはロールバック(see this answer)の影響を受けないので、手作業でidを取り消す必要があると思います。これにより、hibernateは失敗した挿入に対しても現在のIDを取得できます。

JPAライフサイクルアノテーションを使用して、エンティティに関する十分な情報を収集し、保存に失敗した後にクリーンアップを行うことができます。

0

生成戦略は一般的に好まれておらず、理由は次のとおりです。 HibernateはINSERT操作の前に識別子値を生成できません。そのため、HibernateはINSERTクエリを実行し、その直後にSELECTクエリを実行する必要があります。このようにして、Hibernateは永続化されたエンティティインスタンスの識別子値を設定します。

私はPostgreSQLがIDENTITY id生成戦略(Hibernate Identity, Sequence and Table (Sequence) Generator)をサポートしていないと考えています。 PostgreSQLがIDENTITY戦略をサポートしていた場合、SELECTは決して起こらないので、エンティティはIDが初期化されません。

関連する問題