自定义OneToOne Hibernate / JPA协会

时间:2009-08-26 00:21:03

标签: hibernate

我有一个数据库,根据上次业务交易期间更新的数据,可以有不同类型的关联关系。一个例子是在政策编写应用程序中。主表包含通用策略级别信息,并且存在包含诸如代理的信息和被保险人信息之类的信息的相关表。发出第一个事务时,将填充所有表,但是在后续事务中,只有具有更新的表会持久保存到数据库。我现在要做的是创建实现JPA的类,它们将表之间的关系定义为一对一。然后,我想为每个关系实现自定义加载器,以确保每次检索策略实体时,我都能够检索相应表的最新版本。有谁知道如何实现这个逻辑?我尝试使用@NamedNativeQuery并使用HQL,但在这两个实例中它都告诉我,我指定的列名不存在。

非常感谢任何协助。

下面提供了代码,以帮助说明我在做什么。

@Entity
@NamedNativeQuery(name = "loadLatestBilling",
                  query = "Select {i.*} from TransactionSummary as ts outer join BillingInfo i on i.systemAssignId=ts.systemAssignId where ts.systemAssignId=:systemAssignId and i.transSeqNo<=:transSeqNo order by i.systemAssignId, i.transSeqNo DESC",
                  resultClass = BillingInfo.class)

public class CoTransactionSummary implements java.io.Serializable,
    CdbCoTransactionSummary {


@OneToOne(targetEntity = BillingInfo.class, fetch = FetchType.LAZY)
@org.hibernate.annotations.NotFound(action = org.hibernate.annotations.NotFoundAction.IGNORE)
@Loader(namedQuery = "loadLatestBilling")
public BillingInfo getBillingInfo() {
    return billingInfo;
}

public void setBillingInfo(BillingInfo billingInfo) {
    this.billingInfo= billingInfo;
}

}

在上面的示例中,SystemAssignId在与该实体相关的所有记录之间是通用的。对于每个连续的事务,transSeqNo将递增,因此自定义加载器将查找与systemAssignId关联的最高值。

非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

您的命名查询错误 - 您不能在其中包含命名参数。您只能有一个位置参数将被主键值替换(对于复合ID,可能必须有多个位置参数,但在您的情况下不适用)。我也不认为从中返回多个值是合法的;虽然Hibernate可能会让它滑落。

现在,由于查询必须以PK(BillingInfo PK)为基础,通过一对一映射做你想做的事情并不容易(当然,除非你打算真正更新你的{{1}每次指向适当的CoTransactionSummary;但在这种情况下,您不需要所有自定义加载的东西)。您基本上需要重写您的查询以加入BillingInfo表两次 - 第一次获得BillingInfo PK TransactionSummary记录,其中PK由Hibernate提供,第二次获取最新{ {1}}记录。整件事看起来很混乱。

请考虑使用BililngInfo映射(您始终可以将BillingInfo个集合设为私有,并且只通过公共one-to-many方法公开相应的实例。)