Как установить отношения с той же сущностью, используя JPA, Hibernate - PullRequest
1 голос
/ 04 февраля 2012

Я пытаюсь создать отношения между разными людьми, но не смог найти способ сделать это с помощью JPA. Ниже приведена модель для поддержки требования:

Персональный стол:
Id FirstName LastName
1 Джон Хеллер
2 Джозеф Хеллер
3 Эндрю Хеллер
4 Стивен Хеллер

Таблица личных связей
Id Person1 Person2 Отношения
1 1 2 Родитель
2 2 1 ребенок
3 1 3 Брат и сестра
4 3 1 Брат или сестра
5 4 1 секретарь

Может, кто-нибудь поделится вашим опытом, если вы когда-либо реализовывали вышеизложенное, используя Hibernate в качестве поставщика JPA.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2012

Самый простой способ - использовать связь OneToMany между сущностью Person и сущностью RelationShip, причем каждая сущность отображает связанную таблицу:

public class Person {
    @OneToMany(mappedBy = "person1")
    private List<RelationShip> relationships;

    public List<Person> getSiblings() {
        List<Person> result = new ArrayList<Person>();
        for (RelationShip r : relationShips) {
            if (r.getType() == RelationshipType.SIBLING) {
                result.add(r.getPerson2());
            }
        }
    }

    ...
}
0 голосов
/ 04 февраля 2012

Попробуйте это.

@Entity
public class Person {

    @Id
    private Long id;

    @OneToMany
    Set<Sibling> siblings;

    @OneToMany
    Set<Parent> parents;

    @OneToMany
    Set<Child> children;

    @OneToMany
    Set<Secretary> secretaries;
}

@Entity
@Table(name="person_relationship")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="relationship", discriminatorType=DiscriminatorType.STRING)
public abstract class Relationship {

    @Id
    private Long id;

    @OneToOne
    @JoinColumn(name="person1")
    private Person owner;

    @OneToOne
    @JoinColumn(name="person2")
    private Person related;
}

@Entity
@DiscriminatorValue("Sibling")
public class Sibling extends Relationship {}

@Entity
@DiscriminatorValue("Child")
public class Child extends Relationship {}

@Entity
@DiscriminatorValue("Parent")
public class Parent extends Relationship {}

@Entity
@DiscriminatorValue("Secretary")
public class Secretary extends Relationship {}

Использование этого позволит Hibernate (JPA) выполнить тяжелую работу по различению различных типов отношений.

Если бы в реальной жизни было так просто!; -)

0 голосов
/ 04 февраля 2012

Стандартное отношение «многие ко многим» с использованием таблицы соединений.

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