Объект EJB3 / JPA с агрегированным атрибутом - PullRequest
4 голосов
/ 14 сентября 2010

Я хотел знать, есть ли способ получить в отношениях One2Many поле стороны One, которая является совокупностью стороны Many.

Давайте рассмотрим следующий пример:

@Entity
public class A {
 @Id
 private Long id;
 @OneToMany (mappedBy="parentA")
 private Collection<B> allBs;

 // Here I don't know how to Map the latest B by date
 private B latestB;
    // Acceptable would be to have : private Date latestBDate;
}

@Entity
public class B {
 @Id
 private Long id;
 private Date date;
 @ManyToOne (targetEntity=A.class)
 private A parentA;
}

Мой вопрос заключается в том, как я могу сделать отображение поля lastB в объекте сущности A, не выполняя никакой нормализации (не синхронизируя поле с триггерами / слушателями)?

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

Спасибо за чтение / помощь.

PS: Я использую hibernate в качестве поставщика ORM / JPA, поэтому решение Hibernate может быть предоставлено, если решения JPA не существует.
PS2: Или просто скажите мне, что я не должен этого делать (с аргументами, конечно); -)

Ответы [ 2 ]

3 голосов
/ 15 сентября 2010

Я использую hibernate в качестве поставщика ORM / JPA, поэтому решение Hibernate может быть предоставлено, если решения JPA не существует.

Реализация приемлемого решения (то есть выборка Date для последней B) будет возможна с использованием @Formula.

@Entity
public class A {
    @Id
    private Long id;
    @OneToMany (mappedBy="parentA")
    private Collection<B> allBs;

    @Formula("(select max(b.some_date) from B b where b.a_id = id)")
    private Date latestBDate;
}

Ссылки

Ресурсы

2 голосов
/ 14 сентября 2010

См

http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Filtering.2C_Complex_Joins

Обычно JPA не поддерживает это, но некоторые поставщики JPA поддерживают.

Вы могли бы также, - Сделать переменную переходной и ленивой инициализировать ее из OneToMany или просто предоставить метод get, который ищет OneToMany. - Определите еще один внешний ключ до последней. - Удалите отношения и просто запросите последние.

...