具有聚合属性的EJB3 / JPA实体

时间:2010-09-14 12:50:23

标签: java hibernate orm jpa entity-relationship

我想知道是否有办法在One2Many关系中获得One Side的一个领域,这是多方的聚合。

我们来看下面的例子:

@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;
}

我的问题是如何在A实体对象中进行字段latestB的映射而不进行任何去规范化(不与触发器/侦听器保持同步)?

也许这个question提供了一些答案,但实际上我不明白它是如何工作的,因为我仍然希望能够获取所有子对象。

感谢阅读/帮助。

PS:我将hibernate用作ORM / JPA提供程序,因此如果不存在JPA解决方案,则可以提供Hibernate解决方案。
PS2:或者只是告诉我我不应该这样做(当然有论据); - )

2 个答案:

答案 0 :(得分:2)

请参阅,

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

基本上JPA不支持这一点,但有些JPA提供商会这样做。

你也可以, - 使变量瞬态和延迟从OneToMany初始化它,或者只提供搜索OneToMany的get方法。 - 定义另一个最新的外键。 - 删除关系,只查询最新的。

答案 1 :(得分:2)

  

我将hibernate用作ORM / JPA提供程序,因此如果不存在JPA解决方案,则可以提供Hibernate解决方案。

使用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;
}

参考

资源