6

関連クラスを作成できるHibernate / JPAアノテーション(正直なところ、違いはまだわかりません)がいくつかあります。このクラスは、関連する 2 つのアイテムを 1 つのオブジェクトに結合します。私はもともと使用して@JoinTableいましたが、関連付けにさらに多くのメタデータが必要であることに気付いたので、コードを別のオブジェクトタイプに変換する必要がありました.

今のところ、オブジェクト@Idの列をマークするために使用し、.ID@NaturalId (mutable = false)String uuid

私の関連付けクラスは@ManyToOneテーブルを使用して作成していますが、調べてみると、テーブルは@Idフィールドをマッピング列として使用しています。他のシステムに関係/関連付けを簡単に転送するために、この関連付けクラスに を使用すること@NaturalId uuidをお勧めします。

正しい識別子を使用する関係を取得するにはどうすればよいですか?

参考までに、私の DB と Java コードは次のようになります。

AssociationsTable
----------------------------------------------
| ID | META DATA | ID ASSOC. 1 | ID ASSOC. 2 |
----------------------------------------------
| 1  |  stuff    |    1        |     2       |
----------------------------------------------

Objects
------------------------------
| ID | META DATA | UUID      | 
------------------------------
| 1  |  stuff    |  FOO-123  |
------------------------------
| 2  |  stuff    |  BAR-456  |
------------------------------

Association Class{
  ObjA main;
  ObjA sub;

  @ManyToOne
  getMain()

  @ManyToOne
  getSub()
}

ObjA Class{
  Long id;
  @Id
  @GeneratedValue(generator="increment")
  @GenericGenerator(name="increment", strategy = "increment")
  @XmlElement
  @Column(name = "ID", unique = true, nullable = false)
  getId()

  String uuid;    
  @NaturalId (mutable = false)
  @GeneratedValue(generator = "uuid")
  @GenericGenerator(name = "uuid", strategy = "uuid2")
  @Column(name = "uuid", unique = true)
  getUUID()
}
4

1 に答える 1

5

hereで説明されているように、 のreferencedColumnName属性を使用できます。したがって、あなたの例では、マッピングは次のようになります。@JoinColumn

ObjA.java:

package hello;

import org.hibernate.annotations.NaturalId;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class ObjA {
    Long id;
    String uuid;

    public ObjA() {
    }

    public ObjA(String uuid) {
        this.uuid = uuid;
    }

    @Id
    @GeneratedValue
    @Column(name = "obj_a_id", unique = true, nullable = false)
    Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @NaturalId(mutable = false)
    @Column(name = "uuid", unique = true, nullable = false)
    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }
}

Association.java:

package hello;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Association {
    Long id;
    ObjA main;
    ObjA sub;

    public Association() {
    }

    public Association(ObjA main, ObjA sub) {
        this.main = main;
        this.sub = sub;
    }

    @Id
    @GeneratedValue
    @Column(name = "association_id", unique = true, nullable = false)
    Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @ManyToOne
    @JoinColumn(name = "main_uuid", referencedColumnName = "uuid", nullable = false)
    public ObjA getMain() {
        return main;
    }

    public void setMain(ObjA main) {
        this.main = main;
    }

    @ManyToOne
    @JoinColumn(name = "sub_uuid", referencedColumnName = "uuid", nullable = false)
    public ObjA getSub() {
        return sub;
    }

    public void setSub(ObjA sub) {
        this.sub = sub;
    }
}

これらのマッピングは、テーブルのuuid列からの値をobjaテーブルのmain_uuidおよびsub_uuid列に格納するために正常にテストされましたassociation。これは、 、 、 、および PostgreSQL 9.4.4 に対してテストさorg.hibernate.common:hibernate-commons-annotations:4.0.5.Finalorg.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Finalましorg.hibernate:hibernate-core:4.3.10.Finalorg.hibernate:hibernate-entitymanager:4.3.10.Final

于 2015-08-17T16:57:03.963 に答える