1

多くのチュートリアルでは、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 がこの問題を修正しなかった理由がわかりません。

誰もこの問題を克服する方法を知っていますか? ありがとうございました。

4

1 に答える 1

1

私はあなたの設定を完全に理解していません。

@SecondaryTableは単一のエンティティを複数のテーブルに格納するためのものですが、あなたの場合、異なるエンティティ(それぞれが独自のテーブルに格納されている)間に多対1の関係があり、次のようにマッピングする必要があります。

@Entity 
@Table(name="server") 
public class Server { 
    @ManyToOne
    @JoinColumn(name = "cluster_uuid")
    private Cluster cluster;
    ...
}
于 2012-07-03T08:05:43.987 に答える