1

Member、およびの 3 つのテーブルがAddressありMem_Addrます。 エンティティはテーブルによってマップ/接続されMemberます。多対多。AddressMem_Addr

と の次のエンティティがMemberありAddressます。

@Entity 
@Table (name="Member")
public class Member{

    @Id  //....
    private Integer mem_id;

    @OneToOne
    @JoinTable     (name = "Mem_Addr", 
             joinColumns = @JoinColumn(name = "addr_id"), 
      inverseJoinColumns = @JoinColumn(name = "mem_id"))
    Set<Address> addresses = new HashSet<Address>;
    ...
}

Mem_Addrテーブル (エンティティが関連付けられていません)。

addr_id // (PK) Sequence
mem_id  // (FK to mem_id in Member table) 
....
....

Address実在物。

@Entity
@Table(name="Address")
public class Address {

   private String addr_id; // Foreign Key to addr_id in Mem_addr table
   private String address1;
   ...
}

Addressテーブル/エンティティに ID がありません。(デザインについては聞かないでください。今は変更できません。)

そのため、メンバーをロードするときに、そのメンバーのすべての住所の場所をロードしたいと考えています。

解決策は何ですか?

編集:詳細...

基本的に、一部Memberの はテーブルに新しいエントリを持ちMem_Addrます。テーブルの各エントリに対して、Mem_addrテーブルにエントリがありAddressます。

メンバーのアドレスを取得するには、Mem_Addr を参照する必要があります。Mem_Addr はaddr_idプライマリとして、Address はaddr_id外部キーとして持ちます。

4

3 に答える 3

1

挿入と更新は必要ないので、(理論的には) 次のようにすればうまくいくはずです。

@Entity
@Table(name = "Address")
class Address {

 @Id
 private AddressKey id;

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

 public void getId() {
 return id;
 }
}

@Embeddable
class AddressKey implements Serializable {
   @Column(name = "addr_id")
   private String addrId; //also the underscore should be deleted

   @Column(name = "address_1")
   private String address1;



  }

これは、主キーを持たないテーブルに見られる回避策です。ご覧のとおり、ほとんどが偽の ID になります。

于 2014-09-24T21:19:15.570 に答える
1

残念ながら回避策はありません。Hibernate ではテーブルに主キーが必要です。

このドキュメントをチェックアウトできます。

于 2014-09-24T19:54:44.063 に答える
0

Mem_Addrテーブルが 1 対多ではなく、多対多であると確信していますか? Address単一のものが複数に関連付けられる方法がわかりませんMember...

実際には 1 対多であると仮定して、 @SecondaryTableアノテーションを介してエンティティをとテーブルAddressの両方にマップします。これについては、 Hibernate Mapping Two Tables to One Classで説明されているように、id を、via 、および の他のフィールドを介してその他すべてにマッピングします。Mem_AddrAddressMem_Addr.addr_idMemberMem_Addr.mem_idAddress

私はこれを行っていませんが、うまくいくと思います:

@Entity
@Table(name = "Address")
@SecondaryTable(name = "Mem_Addr", pkJoinColumns={
    @PrimaryKeyJoinColumn(name="addr_id" referencedColumnName="addr_id")
})
class Address {
    @Id
    @Column
    private String addr_id;

    ....
}
于 2014-09-24T20:19:08.177 に答える