JPA 複合主キーを使った1対1、多対1

JPAで複合主キーを利用した関連の定義についてなかなかわからなかったのですが・・・試行錯誤の結果ようやく理解できました。
まず、主キーを使った1対1は、@PrimaryKeyJoinColumnを使うみたいですね。@JoinColumnsで設定した場合、登録はうまくいったのですが検索するときにエラーになってしまいました。ただ・・・これってもしかしてHibernate実装の問題なのかも?
とりあえず現在のHibernate EntityManagerの場合、

@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn

としてやればうまく動きました。複合主キーの場合は、関連する永続化クラスが同じ複合主キークラスを使えば大丈夫みたいです。ここで、もし2つのテーブルのカラム名が違った場合を考えてみたのですが・・・

@EmbeddedId
@AttributeOverrides({
	@AttributeOverride(name = "aid", column = @Column(name = "A_ID")),
	@AttributeOverride(name = "bid", column = @Column(name = "B_ID"))
})

みたいな感じで、片方のクラスで@AttributeOverridesを使えばうまく動きました。
(追記)別のサンプルで動かしてみたら、複合主キーを@JoinColumnsで関連づけてみても大丈夫でした。INSERTもSELECTも通常通りに動きました。前回失敗したときは、自分のサンプルの定義に何か別の問題があったのかもしれません。うーん、とりあえずベータ版なので、今の実装の動きを元に色々と判断するのはまだ危険ってことかも・・・


続いて多対1。これは普通に@JoinColumnsで定義して、それぞれの@JoinColumnの中で、「insertable = false, updatable = false」を定義してあげればいいみたいです。これってHibernateと同じ定義なんですね・・・勉強不足でした。

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns( {
	@JoinColumn(name = "aid", insertable = false, updatable = false),
	@JoinColumn(name = "bid", insertable = false, updatable = false) })

ちなみに、@JoinColumnのnameに定義する名前を”AID”にして、主キークラスのプロパティ名を”aid”とかにしてるとエラーになりました。@JoinColumnでカラム名を書くときには、クラスで定義しているカラム名と大文字小文字の記述を合わせないといけないみたいです。うーむ、ちょっとややこしい・・・
ふぅ・・・これで何とか、自然キーつかいまくり、複合主キーつかいまくりのデータ構造に対しても、安心してJPAを使うことが出来そうですね(汗)やはり関連の定義が出来なければO/Rマッピングを導入する意味ありませんし・・・
現時点で@OneToOneと@PrimaryKeyJoinColumnsを組み合わせられないのがちょっと気になりますが、とりあえず「同じ複合主キー構造を持つ永続化クラスは、同じ複合主キークラスを利用する」という原則を守れば、うまくやっていけそうな気がします。