JPAの複合キー

JPAの複合キーもきれいに対応してるのね。

代替主キー使えない箇所が今回はあったので大丈夫かなぁと心配したが、見事きれいに生成された。ちょっと感動。

例えばentityテーブルがあって、項目にキーとなるkey1,key2,ただの項目のnameと3つあったとして

@Entity
@Table(name = "entity")
@NamedQueries({})
public class Entity implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @EmbeddedId
    protected EntityPK entityPK;
    
    @Column(name = "name")
    private String name;

    public Entity() {
    }

    public Entity(EntityPK entityPK) {
        this.entityPK = entityPK;
    }

    public Entity(int key1, int key2) {
        this.entityPK = new EntityPK(key1, key2);
    }
…省略
}

@Embeddable
public class EntityPK implements Serializable {
    @Column(name = "key1", nullable = false)
    private int key1;
    @Column(name = "key2", nullable = false)
    private int key2;

    public EntityPK() {
    }

    public EntityPK(int key1, int key2) {
        this.key1 = key1;
        this.key2 = key2;
    }
    
…省略
}

という感じでコンストラクタ含めてきれいに作ってくれる。エンティティ名+PKというクラスが生成されるようだ。コードを見てわかるようにエンティティクラスのコンストラクタでキーを渡してあげるだけで自動的に埋め込みクラスの生成等もしてくれるため埋め込みクラスすらあまり意識はしない。

その他のアクセサやhashCode、equals、toStringも他のエンティティ同様全部生成してくれる。JPA使うならやっぱりNetBeansだなぁといまさらながら思った。JPAは5.5から実装しているだけあってIDEサポートとしての歴史も1年半以上と結構ある。

NetBeansを使うと面倒なものはすべてウィザードに任せて、ロジックのみに専念できるのが非常によろしい。JNDIがどうだとかEntityクラスがどうだとか、パッケージングも開発者は意識しないですむ。EJBJSFも同様だ。

6.5ではさらにエンティティクラスの生成方法の強化などパワーアップしているので期待したい。