Hibernate Mapping - таблица соединений без @Id

1

У меня есть три таблицы: Member, Address и Mem_Addr. Mem_Addr Member и Address сопоставлены/связаны таблицей Mem_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;
   ...
}

У меня нет ID в таблице/сущности Address. (Пожалуйста, не спрашивайте меня о дизайне. Его нельзя изменить сейчас.)

Поэтому, когда я загружаю элементы, я хочу загрузить все адреса для этого члена.

Каково решение?

Изменить: Подробнее...

В основном у некоторых Member будет новая запись в таблице Mem_Addr. Для каждой записи в таблице Mem_addr будет запись в таблице Address.

Чтобы получить адрес члена, мне нужно передать Mem_Addr. Mem_Addr имеет addr_id как первичный, а адрес имеет addr_id как внешний ключ.

  • 1
    Есть ли addr_id в сущности Address, потому что я вижу в сущности Mem, которую вы вызываете?
  • 0
    @Rika Рика, ты прав .. Я опечатка. Исправленный.
Показать ещё 17 комментариев
Теги:
hibernate
entity
hibernate-onetomany

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;



  }

Это временное решение для таблиц, которые не имеют первичных ключей. Как вы можете видеть, это в значительной степени делает фальшивый идентификатор.

  • 0
    Если мы не беспокоимся о вставках и обновлениях, зачем беспокоиться о @Embeddable? Просто сопоставьте addr_id как @Id и покончите с этим. (Кроме того, address1 не является частью первичного ключа таблицы, поэтому я не уверен, почему вы включили его в @Embeddable ...)
  • 0
    Но как вы сопоставляете таблицу Address to Members. Между этими двумя нет никакой связи. Это может быть простая вещь .. .. вы меня понимаете .. Я новичок в Hibernate :-)
Показать ещё 2 комментария
1

Вы уверены, что таблица Mem_Addr - это много-ко-многим, а не один-ко-многим? Я не вижу, как один Address может быть связан с более чем одним Member...

Предполагая, что это на самом деле один-ко-многим, сопоставить Address субъекта к обоим Mem_Addr и Address таблиц через @SecondaryTable аннотацию, как описано в Hibernate Mapping двух таблиц в одном классе, отображение идентификатора Mem_Addr.addr_id, на Member с помощью Mem_Addr.mem_id, и все остальное через другие поля в Address.

Я этого не делал, но считаю, что это сработает:

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

    ....
}
  • 0
    Это возможно. Потому что в страховом домене несколько клиентов могут быть по одному адресу. Хорошо, если я предполагаю, что это будет @OneToMany, но ваше решение неясно. Можете ли вы уточнить?
  • 0
    Я этого не делал (к счастью, у меня всегда были схемы, которые были более разумными, чем то, с чем вы застряли), но вы должны иметь возможность использовать для этого аннотацию @SecondaryTable, как описано в stackoverflow.com/questions/ 1667918 /… .
Показать ещё 4 комментария
1

К сожалению, пути нет, Hibernate требует, чтобы ваша таблица имела первичный ключ.

Вы можете проверить этот документ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню