AssociationOverrideとAssociationOverrides

MappedSuperclassクラスで指定された@JoinColumnsの定義を@AttributeOverrideで上書きできるんだろうかと悩んでたんですが、まさにそれを実現するAssociationOverrideとAssociationOverridesというアノテーションがfinalリリースではjavax.persistenceパッケージに入るみたいです。

https://glassfish.dev.java.net/nonav/javaee5/api/javax/persistence/AssociationOverride.html
https://glassfish.dev.java.net/nonav/javaee5/api/javax/persistence/AssociationOverrides.html

PFDでは@AttributeOverrideが@JoinColumnを上書きできる例が載っているんですが、@JoinColumnの上書きも@AssociationOverrideが担当するようです。@AttributeOverride(s)はBasicなプロパティやフィールドのオーバライド専用、@AssociationOverride(s)はマッピングのプロパティやフィールドのオーバライド専用になるということですね。


Hibernateも3.1.3から対応しているようです。ちょっと動かしてみました。

Addressの複合キー

public class AddressPK implements Serializable {
  long id1;
  long id2;
}

Addressエンティティ

@Entity
@IdClass(AddressPK.class)
public class Address {
  @Id
  long id1;
  @Id
  long id2;
}

Superclassクラス : EntityではなくMappedSuperclass

@MappedSuperclass
public class Superclass {
  @ManyToOne
  @JoinColumns( { @JoinColumn(name = "fk_id1", referencedColumnName = "id1"),
      @JoinColumn(name = "fk_id2", referencedColumnName = "id2") })
  Address address;
}

Employeeエンティティ(Superclassを継承している)

@Entity
@AssociationOverride(name = "address", joinColumns = {@JoinColumn(name = "aaa"), @JoinColumn(name = "bbb")})
public class Employee extends Superclass {
  @Id
  long id;
}
  • このとき@AssociationOverrideが有効なのでマッピングされるEmployeeテーブルのカラムは次の3つということです。
    • ID
    • AAA
    • BBB
  • ちなみに@AssociationOverrideをはずすとSuperclassクラスの@JoinColumnsの指定が効いてEmployeeテーブルのカラムは次の3つです。
    • ID
    • FK_ID1
    • FK_ID2
  • さらにちなみに@AssociationOverrideをはずし、Superclassクラスの@JoinColumnsもはずすとEmployeeテーブルのカラムはデフォルトの名前付けルールが適用されて次の3つになります。
    • ID
    • ADDRESS_ID1
    • ADDRESS_ID2