Hibernate, сохраняя ссылку на «родительский» объект - PullRequest
1 голос
/ 26 марта 2012

У меня очень мало опыта в спящем режиме, так что это, вероятно, правильный вопрос новичка:

Чтобы этот вопрос был простым, скажем, у меня есть два типа объектов: семья и человек.Одна семья состоит из нескольких человек.

Если у меня есть отношение один-ко-многим, определенное для семьи по отношению к человеку, то отношение между ними будет содержаться в таблице лиц как внешний ключ.Тогда я бы предположил, что добавления людей в семью, а затем сохранения объекта семьи будет достаточно, чтобы эти отношения были включены в базу данных.Однако, похоже, это не так.

В настоящее время я должен сделать следующее:

1) Добавить упомянутое отношение один-ко-многим в семье, что дает мненеобходимые методы для добавления или удаления людей к объекту семьи.

2) Добавьте отношение «многие к одному» на объекте «человек» в семью, что позволяет мне ссылаться на семью из этого человека.

3) Затем я продолжаю добавлять этот объект персоны с заданной вручную ссылкой на семью к объекту семейства.Затем я сохраняю объект семьи.

Это просто кажется очень громоздким и неправильным.Есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

Поскольку Family - Person является отношением один ко многим, класс Family должен иметь свойство коллекции (например, A List) для хранения коллекции его Person.

Вы можете инкапсулировать процесс установки ссылок между Family и Person при добавлении Person к Family в методе, например, метод с именем addPerson() .Your Family и Person класс выглядит примерно так:

@Entity
public class Family{

    @OneToMany(cascade = CascadeType.ALL, mappedBy="family")
    private List<Person> personList = new ArrayList<Person>();

    public void addPerson(Person personToAdd){
        this.personList.add(personToAdd);
        personToAdd.setFamily(this);
    }

   /**getter and setter**/
}

@Entity
public class Person{

    @JoinColumn(name="family_id")
    @ManyToOne
    private Family family;

    /**getter and setter**/

}

Затем для добавления человека в существующую семью (ID = 1):

session.beginTransaction();
Family  family = (Family)session.get(Family.class, 1);   
Person person = new Person();
person.set(xxxx);   
family.addPerson(person);  
session.getTransaction().commit();
1 голос
/ 26 марта 2012

В том, что вы делаете, нет ничего плохого, это называется обратное отображение . Это даже логически правильно.

В Персона.java

Family family;

В Family.java

List<Persons> familyMembers; //or any other collection.

Если вам не нужна обратная ссылка для Family на Person , вы можете удалить ее. Вы можете попробовать пример здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...