多くのチュートリアルでは、SecondaryTable アノテーションを使用できると述べているため、これは意味がありませんが、休止状態では機能しません。私は次のようなスキーマを持っています:
@Entity
@Table(name="server")
@SecondaryTable(name="cluster", pkJoinColumns = { @PrimaryKeyJoinColumn(name = "uuid", referencedColumnName = "cluster_uuid") })
public class Server {
@Id
@Column(name = "uuid")
private String uuid;
@Column(name = "cluster_uuid")
private String clusterUuid;
@Column(name = "ip", table="cluster")
private String ip;
..... }
@Entity
@Table(name = "cluster")
public class Cluster {
@Id
@Column(name = "uuid")
private String uuid;
@Column(name = "ip")
private String ip;
.....
}
Server.clusterUuid は、Cluster.uuid への外部キーです。Server.clusterUuid を Cluster.uuid に結合して、クラスターから ip 列を取得するサーバー エンティティを取得したいと考えています。
その後、休止状態の例外が発生しました。
原因: org.hibernate.AnnotationException: SecondaryTable JoinColumn は、org.hibernate.cfg.annotations.EntityBinder.bindJoinToPersistentClass(EntityBinder) の org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:402) で非主キーを参照できません.java:620) org.hibernate.cfg.annotations.EntityBinder.createPrimaryColumnsToSecondaryTable(EntityBinder.java:612) で
多くの人がこの問題に遭遇しました。しかし、Hibernate の bugzilla の最初のバグは 2010 年でした。これは基本的な機能であるはずなので、2 年以上も存在していたことに驚いています。JPA仕様では主キーのみがマッピングを実行できるという投稿がありますが、JPAウィキブックから以下を取得します
JPA では、複数のテーブルを 1 つのクラスに割り当てることができます。@SecondaryTable および SecondaryTables アノテーションまたは要素を使用できます。デフォルトでは、 @Id 列は両方のテーブルにあると想定され、セカンダリ テーブルの @Id 列はテーブルの主キーであり、最初のテーブルへの外部キーです。最初のテーブルの @Id 列が @PrimaryKeyJoinColumn と同じ名前でない場合、または外部キー結合条件の定義に使用できます。
非主キーの場合は明らかに問題ありません。次に、結合句で簡単に実装できるように思われるため、Hibernate がこの問題を修正しなかった理由がわかりません。
誰もこの問題を克服する方法を知っていますか? ありがとうございました。