Как присоединиться к Hibernate? - PullRequest
0 голосов
/ 21 января 2019
public class Primary{
    private long id;
    @Id
    @GeneratedValue(
        strategy = GenerationType.IDENTITY
    )
    @Column(
        name = "id"
    )
    public void getId(){return id;}

    //other vars
}

public class Secondary{
    //other vars
    private Primary primary;
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "primary_id", unique = true)
    public Primary getPrimary(){return primary;}
}

Отсюда довольно легко получить первичный объект из вторичного объекта.Тем не менее, как я могу получить вторичный объект из первичного объекта, не выбирая дважды в Hibernate?

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Класс Primary должен выглядеть следующим образом:

@OneToMany(mappedBy="primary", cascade={CascadeType.ALL})
private List<Secondary> secondaries;
// getter and setter

И вы должны сделать небольшую модификацию в Secondary:

@JoinColumn(name = "id", unique = true)
public Primary getPrimary(){return primary;}

Причина Столбец соединения должен ссылаться на объединенное поле (id) в Primary.

0 голосов
/ 21 января 2019

Ответ может сильно отличаться в зависимости от того, что вы ищете.

Исходя из вашего текущего отображения, предполагая, что у вас есть экземпляр Primary, вы можете получить соответствующий ему Secondary, запросив,Например, по HQL:

from Secondary s where s.primary = :primary

и передайте ваш первичный как параметр.

Если вы ищете способ навигации из экземпляра объекта Primary, вы могли бы создать би-направленное отображение:

class Primary {
    @OneToMany(mappedBy="primary", ...)
    private Set<Secondary> secondaries;
}

class Secondary {
    @ManyToOne
    private Primary primary;
}

Вы можете обратиться к моему (очень старому) ответу на связанный вопрос о том, как его определить.https://stackoverflow.com/a/13812047/395202

Однако просто наличие двунаправленных отношений НЕ избегает «выбора дважды», , если «выбор дважды» означает выполнение 2 запросов SQL в БД .

Чтобы уменьшить такие двусторонние, есть несколько способов решить.Первый - объявить отношения как EAGER fetch.Однако этот способ я обычно не рекомендую, поэтому я не буду углубляться.

Другой (imho, более подходящий) способ - это выборка соединения, когда вы выбираете Primary.Чтобы получить экземпляр Primary со связанными экземплярами Secondary, используйте HQL, например:

from Primary p left join fetch p.secondaries where ....
0 голосов
/ 21 января 2019

Добавьте этот метод Setter во вторичный класс

public Primary getPrimary() {
        return primary;
    }

И получить первичный объект из вторичного класса

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