Hibernate またはその他の ORM で複合主キーを実装する場合、識別関係 (PK の一部である FK) を使用する複合主キー コンステレーションで、insertable = false、updatable = false を配置する場所が最大 3 つあります。
- 複合 PK クラスの @Column アノテーション (@Embeddable クラスのみ) または
- エンティティ クラスの関連付け @JoinColumn/s アノテーションまたは
- エンティティークラスの冗長PK プロパティの @Column アノテーションへ (@IdClass クラスのみ)
3 番目は、@IdClass と JPA 1.0 AFAIK を使用する唯一の方法です。http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_Relationshipsを参照してください。ケース 1. と 2. のみを検討します。
Q: 一般的に、「挿入可能 = false、更新可能 = false」を配置するのに適した場所はどれですか?
この質問に関して、Hibernate で問題が発生しました。たとえば、Hibernate 3.5.x は Zip テーブルについて文句を言います。
CREATE TABLE Zips
(
country_code CHAR(2),
code VARCHAR(10),
PRIMARY KEY (country_code, code),
FOREIGN KEY (country_code) REFERENCES Countries (iso_code)
)
と:
org.hibernate.MappingException: Repeated column in mapping for entity: com.kawoolutions.bbstats.model.Zip column: country_code (should be mapped with insert="false" update="false")
org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:676)
org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:698)
...
ご覧のとおり、country_code 列は PK と FK の両方です。そのクラスは次のとおりです。
エンティティ クラス:
@Entity
@Table(name = "Zips")
public class Zip implements Serializable
{
@EmbeddedId
private ZipId id;
@ManyToOne
@JoinColumn(name = "country_code", referencedColumnName = "iso_code")
private Country country = null;
...
}
複合 PK クラス:
@Embeddable
public class ZipId implements Serializable
{
@Column(name = "country_code", insertable = false, updatable = false)
private String countryCode;
@Column(name = "code")
private String code;
...
}
insertable = false、updatable = false をエンティティ クラス アソシエーションの @JoinColumn に入れると、すべての例外が消え、すべて正常に動作します。ただし、上記のコードが機能しない理由がわかりません。これに問題があるのは Hibernate である可能性があります。@Column「挿入可能= false、更新可能= false」を評価していないように見えるため、説明されているのはHibernateのバグですか?
本質的に、標準的なJPAの方法、ベストプラクティス、または「挿入可能= false、更新可能= false」を配置する場所は何ですか?