EDIT
Привет всем.
ЧТО Я ПЫТАЮСЬ ПОЛУЧИТЬ
Мне нужна таблица, представляющая список личных данных, эта таблица называется PERSON и должна иметь следующие столбцы:
ID NAME SURNAME STREET ID_CITY
Ну, у меня уже есть таблица в моей базе данных, которая содержит все муниципалитеты моей страны, эта таблица называется MUNICIPALITY и имеет следующие столбцы:
ID COUNTRY PROVINCE NAME
Я написал класс Municipality.java , чтобы представить таблицу выше, этот класс:
@Entity
public class Municipality implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String country;
private String province;
private String name;
public Municipality() {
}
...
Итак, я подумал, что хорошей реализацией таблицы PERSON является написание emebedded класса Address.java, который содержит некоторую информацию об «адресе» человека для встраивания в класс Person.java.
Address.java Simpy содержит улицу и объект муниципалитета:
@Embeddable
public class Address implements Serializable {
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ID_CITY")
@Cascade(CascadeType.SAVE_UPDATE)
private Municipality municipality;
@Column(length=45)
private String street;
public Address() {
}
...
Адрес просто добавляется в Person.java класс:
@Entity
public class Person implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String name;
private String surname;
@Embedded
private Address address;
public Person() {
}
...
Хорошо, если теперь я сохраню экземпляр Person:
Person p=new Person();
Address a=new Address();
a.setStreet("bla bla");
Municipality mun=new Municipality();
mun.setName("ZZZ");
a.setMunicipality(mun);
p.setAddress(a);
session.save(p);
Все работает отлично, hibernate создайте таблицу PERSON именно так, как я хочу.
ПРОБЛЕМА
Но теперь я хочу также список всех адресов, связанных с объектом муниципалитета, поэтому мне не нужно делать «выбор» для этого.
Я думаю, что хорошо, чтобы добавить сборник адресов в муниципалитете:
@CollectionOfElements
private List<Address> addressList;
Но теперь, если я спасу человека, hibernate создаст новую таблицу MUNICIPALITY_ADDRESSLIST:
MUNICIPALITY_ID ID_CITY STREET
Таблица выше содержит всегда значения NULL ... так что это абсолютно бесполезно, и я не хочу этого!
Я прочитал несколько документов о @CollectionOfElements и @OneToMany и обнаружил, что могу определить таблицу соединений. Так что я подумал установить PERSON как стол соединения ...
@CollectionOfElements
@JoinTable(name="PERSON")
private List<Address> addressList;
Первая вставка Person работает хорошо, я получаю таблицу PERSON, как я хочу, и MUNICIPALITY_ADDRESSLIST больше не создается.
Но когда я делаю вторую вставку, hibernate добавляет столбец в таблицу PERSON: MUNICIPALITY_ID
ID STREET NAME SURNAME ID_CITY MUNICIPALITY_ID
MUNICIPALITY_ID содержит всегда значения NULL, так почему этот столбец добавляется?
Конечно, мои реализации очень плохие, я новичок в hibernate и JPA, так где же моя главная ошибка?
Надеюсь, теперь это более понятно ... извините за мой плохой английский.
Спасибо.