Hibernate 休眠非唯一的一对一映射
我们正在使用一个遗留数据库,我想知道我们的设置是否可以使用Hibernate的方式: 我们有两个表Entity和EntityDefHibernate 休眠非唯一的一对一映射,hibernate,jakarta-ee,hibernate-mapping,Hibernate,Jakarta Ee,Hibernate Mapping,我们正在使用一个遗留数据库,我想知道我们的设置是否可以使用Hibernate的方式: 我们有两个表Entity和EntityDef 创建表实体 ( 身份证加倍, 名称VARCHAR(20), 主键(id) ) 创建表entitydef ( 身份证加倍, 生效日期, 终止日期, VARCHAR类(20), 主键(id,终止日期) ) 基本上,对于每个实体,它可以有多个对应的EntityDef,用于指定特定有效期的参数。这些EntityDef的有效期是不相交的,因此在任何给定时间,实体和Ent
创建表实体
(
身份证加倍,
名称VARCHAR(20),
主键(id)
)
创建表entitydef
(
身份证加倍,
生效日期,
终止日期,
VARCHAR类(20),
主键(id,终止日期)
)
基本上,对于每个实体,它可以有多个对应的EntityDef,用于指定特定有效期的参数。这些EntityDef的有效期是不相交的,因此在任何给定时间,实体和EntityDef之间都应该存在一对一的关系。当尝试使用hibernate映射实体表时会出现问题。我们使用以下映射
我想说,你的建议和过滤技术的结合
- 创建一对多关系,并使用实体类中的逻辑从集合中获取正确的EntityDef
- 使用
我能胜任这项工作
与其映射联接的类实体,不如创建一个包含EntityDef
集合的实体
。因此,与其映射
<join table="entitydef">
将集合映射与筛选器一起使用:
<set name="entityDefs" inverse="true">
<key column="id"/>
<one-to-many class="com.company.EntityDef"/>
<filter name="effectiveDate" condition=":asOfDate BETWEEN effectivedate and terminationdate" />
</set>
如果(如问题中所述)始终存在到给定时间的一对一
映射,我们需要将筛选器注入会话sess.enableFilter(“effectiveDate”)…
(例如,某些AOP是确定的)
现在,我们总是有一个entitydef
集合,其中正好包含一个项。因此,我们可以在entity.category
accessors中隐藏对第一条记录的操作
我们是这样使用它的。它在创建实体时需要更多的逻辑,但最后它还支持在EntityDef上的投影(不影响分页,因为过滤器总是返回一行)Hi Radim,感谢您的建议。我认为这绝对是最好的解决方案,因为我们可以在业务层根本不知道更改的情况下实施它。从进一步的研究来看,Hibernate过滤器似乎无法改变关系的基数(例如,从一对多到一对一),但如果Hibernate支持一些有效约会的概念,那就更好了。我们也在不同的领域使用这种方法,例如国家,而不仅仅是日期。正如您所说:我们已经更改了DL实现(在稍后的案例中)以应用此需求,其他部分都没有受到影响。。。祝你冬眠好运;)
<set name="entityDefs" inverse="true">
<key column="id"/>
<one-to-many class="com.company.EntityDef"/>
<filter name="effectiveDate" condition=":asOfDate BETWEEN effectivedate and terminationdate" />
</set>