8

私は2つのモデルを持っています。

@Entity
public class Student
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    protected long id;

    @?
    protected Address homeAddress;

    @?
    protected Address schoolAddress;
}

@Entity
public class Address
{
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   protected long id;

   @?
   protected List<Student> students;
}

アソシエーションを機能させるには、どのJPA / hibernateアノテーションを上homeAddressに置く必要がありますか?schoolAddressstudents

もちろん、私は多くのことを試しましたが、何もうまくいきませんでした。たとえば、設定

    @ManyToOne
    @JoinColumn (name="student_homeAddress_id", updatable = false, insertable = false)
    protected Address homeAddress;

    @ManyToOne
    @JoinColumn (name="student_schoolAddress_id", updatable = false, insertable = false)
    protected Address schoolAddress;

    @OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER)
    @JoinColumns({
    @JoinColumn(name = "student_homeAddress_id", referencedColumnName = "student_homeAddress_id"),
    @JoinColumn(name = "student_schoolAddress_id", referencedColumnName = "student_schoolAddress_id")})
    @IndexColumn(name="students_index")
    protected List<Student> students;

yealds Unable to find column with logical name: student_homeAddress_id in org.hibernate.mapping.Table(Address) and its related supertables and secondary tables。また、使用してみmappedByましたが、それは単一の引数を取ります(できませんmappedBy="student_homeAddress_id, student_schoolAddress_id"

JoinColumnsタブレットへの移動も検討しましたStudentが、JoinColumnsがあまり意味をなさない複数のアドレスがあるため、OneToManyとManyToOneの注釈がどのように表示されるかわかりません。

動作したが、関連付けを作成していなかったのは、次のことでした。

    @OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER)
    @JoinColumn(name="address_id")
    @IndexColumn(name="students_index")
    protected List<Student> students;

これを使用して、モデルをDBに保存する場合、student_homeAddress_idとstudent_schoolAddress_idは、両端を保存した後でも常にnullでした(StudentモデルとAddressモデル)。

私の考えでは、Addressテーブルには3つの追加の列があります:student_homeAddress_id(homeAddressのStudentテーブルのStudentのID)、student_schoolAddress_id(schoolAddressのStudentテーブルのStudentのID)、students_index(0 students-リスト上の場所に基づく)。それで十分でしょう?

何か案は?

どうもありがとう!

4

2 に答える 2

6

maelの提案を試しましたが、うまくいきませんでした。

私たちはこれをフォローすることになりました。

言い換えれば、私たちはOneToMany関係を持っています:

オンStudent

protected List<AddressStudentAssociation> addresses;

オンAddress

protected List<AddressStudentAssociation> students;

そしてAddressStudentAssociation

@ManyToOne
@PrimaryKeyJoinColumn(name="STUDENTID", referencedColumnName="id")
private Student student;
@ManyToOne
@PrimaryKeyJoinColumn(name="ADDRESSID", referencedColumnName="id")
private Address address;

さらに、一方のアドレスをもう一方のアドレスから分離するための引数(isHome)。

最後に、リストをトラバースしStudentて正しいアドレスを返すものがあります。また、それを機能させるために注釈を試してみる必要がありました。一般的には最適ではありませんが、それは機能し、私たちはすでに物事を機能させるために多くの時間を費やしました。:|public Address getHomeAddress()addresses

于 2012-10-31T14:06:00.027 に答える
4

複数のフィールドに@OneToManyを関連付けたいエンティティがある場合は、@ JoinTableを使用して、Hibernateがリレーションシップ用に2つのテーブルを生成できるようにする必要があります。

@JoinTable javadocから:

結合テーブルは通常、多対多および単方向の1対多の関連付けのマッピングで使用されます。また、双方向の多対1 / 1対多の関連付け、単方向の多対1の関係、および1対1の関連付け(双方向と単方向の両方)をマップするために使用することもできます。

関係の所有側にある埋め込み可能クラスとの関係のマッピングに結合テーブルが使用される場合、埋め込み可能クラスではなく包含エンティティが関係の所有者と見なされます。

JoinTableアノテーションが欠落している場合、アノテーション要素のデフォルト値が適用されます。結合テーブルの名前は、アンダースコアを使用して連結された(所有側が最初の)関連するプライマリテーブルのテーブル名であると見なされます。

この例を見てください:

@Entity
@Indexed(index = "causa_penal")
@Table(name = "causas_penales")
public class CausaPenal implements Serializable {



     @Id
     @GeneratedValue(strategy = GenerationType.TABLE)
     @Column(name = "id")
     @DocumentId
     private Integer id;

     @Version
     @Column(name = "opt_lock")
     private Integer version;

     @ManyToMany(cascade = { CascadeType.ALL })
     @JoinTable(name = "causapenal_imputados")
     @IndexedEmbedded(depth = 1)
     private List<ParteMaterial> imputados;

     @ManyToMany(cascade = CascadeType.ALL)
     @JoinTable(name = "causapenal_victimas")
     @IndexedEmbedded(depth = 1)
     private List<ParteMaterial> victimas;

    //Getters and Setters
}

ご覧のとおり、CausaPenalがParteMaterialを2回指しています。しかし、私はそれらのリストが互いに独立している必要があります。したがって、@ JoinTableを使用して、この関係を4つのテーブルでマップする必要があることをHibernateに伝えます。最後に、ParteMaterialエンティティのテーブル。

于 2012-10-12T14:39:47.813 に答える