Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 休眠非唯一的一对一映射_Hibernate_Jakarta Ee_Hibernate Mapping - Fatal编程技术网

Hibernate 休眠非唯一的一对一映射

Hibernate 休眠非唯一的一对一映射,hibernate,jakarta-ee,hibernate-mapping,Hibernate,Jakarta Ee,Hibernate Mapping,我们正在使用一个遗留数据库,我想知道我们的设置是否可以使用Hibernate的方式: 我们有两个表Entity和EntityDef 创建表实体 ( 身份证加倍, 名称VARCHAR(20), 主键(id) ) 创建表entitydef ( 身份证加倍, 生效日期, 终止日期, VARCHAR类(20), 主键(id,终止日期) ) 基本上,对于每个实体,它可以有多个对应的EntityDef,用于指定特定有效期的参数。这些EntityDef的有效期是不相交的,因此在任何给定时间,实体和Ent

我们正在使用一个遗留数据库,我想知道我们的设置是否可以使用Hibernate的方式:

我们有两个表Entity和EntityDef

创建表实体
( 
身份证加倍,
名称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>