2

JPA の EclipseLink 実装を使用していますが、問題があります。

これが私のエンティティクラスです:

@実在物
@Table(name = "出席")
public class Attendance は Serializable を実装します {
private static final long serialVersionUID = 1L; @ID @GeneratedValue(戦略 = GenerationType.IDENTITY) @Basic(オプション = false) @Column(name = "id") プライベート ショート ID。

....

MySQL テーブル (基礎となるデータ ストア) には、auto_incrementフラグも設定されています。

idエンティティを永続化する前に、自動生成された値 (フィールド) を取得するにはどうすればよいですか? したがって、テーブルに 3 つのエンティティがある場合 ( id IN (1, 2, 3))、次の自動生成値として 4 を取得したいと考えています。

私が持っている唯一の回避策は次のとおりです。

  1. id最大のフィールドを持つエンティティの ID を取得します。

私にできることはそれだけですか?

4

1 に答える 1

0

JPA 2.0を使用している場合は、これを試すことができます。

entityManagerFactory.getPersistenceUnitUtil().getIdentifier(attendance);

免責事項: 自分で試したことはありません。

idそれ以外の場合は、id 生成戦略を、エンティティを永続化する前に取得できるものに変更できます。たとえば、テーブル ジェネレーターを使用して を生成してみてくださいidここで、 Use Table Generator To Generate IDという例を見つけました。次に、そのテーブルから値を直接読み取ることができます。を使用してこれを自動的に処理できない場合があります。@Id正確には、次をid自分で計算することになります。したがって、同じ考え方を採用できますがid、操作の作成中にすべての作業を自分で行い、JPA に操作を生成させないでください。

またはsequence、サポートされている場合は を使用することもできます。またsequence、次の値を自分で取得して手動で設定する必要があります。挿入がない場合にスキップされたids を失う準備をするか、何らかの方法でそれを処理します。

または、あなたがしていることに問題はありません。原子性に注意してください。または、複数のトランザクションを同時に実行するケースがない場合もあります。

于 2011-07-07T10:26:29.303 に答える