1. ホーム
  2. java

[解決済み] どちらのアノテーションを使用すればよいですか?IdClass と @EmbeddedId のどちらを使用すればよいですか?

2022-05-09 22:21:37

質問

JPA (Java Persistence API)の仕様では、エンティティの複合キーを指定する方法が2種類あります。 @IdClass@EmbeddedId .

私はマッピングされたエンティティに両方のアノテーションを使用していますが、これは JPA .

複合キーの指定方法を1つだけ採用したいのですが、どうすればいいですか?本当はどれが一番いいのでしょうか?なぜですか?

どのように解決するのですか?

私は、次のように考えています。 @EmbeddedId の方がより冗長であると思われます。 @IdClass では、フィールドアクセス演算子を使って主キーオブジェクト全体にアクセスすることはできません。そのため @EmbeddedId とすると、このようになります。

@Embeddable class EmployeeId { name, dataOfBirth }
@Entity class Employee {
  @EmbeddedId EmployeeId employeeId;
  ...
}

これは、複合キーを構成するフィールドが、フィールドアクセス演算子を通じてアクセスされるクラスに集約されているため、明確な概念を示しています。

もう一つの違いは @IdClass@EmbeddedId は、HQLを書くときです。

@IdClass と書くのです。

select e.name from Employee e

と共に @EmbeddedId と書かなければならない。

select e.employeeId.name from 従業員 e

同じクエリに対して、より多くのテキストを書かなければならないのです。が推進するような、より自然な言語とは異なるという意見もあるかもしれません。 IdClass . しかし、あるフィールドが複合キーの一部であることをクエリからすぐに理解することは、ほとんどの場合、非常に有益なことです。