3

@ElementCollectionおよび@CollectionTableアノテーションを使用してEntityで埋め込み可能な(Stringなどの基本型など)オブジェクトを使用しているJPA2では、新しいテーブルが作成されますが、新しいテーブルで列に主キー制約を宣言する方法は?以下は私のコードです

public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name; 
private String salary;
@Transient
private String phnNum;
@Enumerated(EnumType.STRING)
private EmployeeType type;

@ElementCollection
@CollectionTable(name="vacations" , joinColumns=@JoinColumn(name="Emp_Id"))
private Collection<Vacation> vacationBooking;

@ElementCollection
private Set<String> nickNames;

    ...................

このコードでは、「vacation」と「employee_nickname」の 2 つのテーブルがスキーマに作成されます。しかし、両方のテーブルで1つの主キー列を宣言したいと思います。私はこれのために何をしますか?

4

2 に答える 2

1

主キー自体は JPA 2.0 でサポートされていないようです。

ウィキブックスから:

JPA 2.0 仕様では、Embeddable で Id を定義する方法が提供されていません。ただし、ElementCollection マッピングの要素を削除または更新するには、通常、一意のキーが必要です。そうしないと、更新のたびに、JPA プロバイダーはエンティティーの CollectionTable からすべてを削除してから、値を挿入し直す必要があります。そのため、JPA プロバイダーは、外部キー (JoinColumn(s)) と組み合わせて、Embeddable 内のすべてのフィールドの組み合わせが一意であると想定する可能性が高くなります。ただし、Embeddable が大きい場合や複雑な場合、これは非効率的であるか、実行できない可能性があります。

一部の JPA プロバイダーでは、この問題を解決するために、Embeddable で Id を指定できる場合があります。この場合、外部キーが含まれているため、ID はテーブルではなくコレクションに対してのみ一意である必要があることに注意してください。これに CollectionTable の一意のオプションを使用できるようにするものもあります。それ以外の場合、Embeddable が複雑な場合は、それをエンティティにして、代わりに OneToMany を使用することを検討してください。

于 2020-01-30T16:42:47.030 に答える