У меня есть три таблицы: 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
как внешний ключ.
Ладно, поскольку вставки и обновления не нужны, возможно, должно работать следующее (теоретически):
@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;
}
Это временное решение для таблиц, которые не имеют первичных ключей. Как вы можете видеть, это в значительной степени делает фальшивый идентификатор.
addr_id
как @Id и покончите с этим. (Кроме того, address1
не является частью первичного ключа таблицы, поэтому я не уверен, почему вы включили его в @Embeddable ...)
Вы уверены, что таблица 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;
....
}
К сожалению, пути нет, Hibernate требует, чтобы ваша таблица имела первичный ключ.
Вы можете проверить этот документ.