Hibernate - 将复合关系映射到非主键

时间:2012-05-14 09:46:17

标签: hibernate nhibernate jpa nhibernate-mapping

我必须映射一个大型企业数据库架构。由于许多遗留应用程序依赖于该模式,我无法将其从复合键更改为代理键(除了使用带有70%数据库对象的替代触发器的视图)这导致了一些问题我不知道该怎么克服。

  1. 如何映射具有代理(主要,自动增量)键和复合唯一键的表,其中多个表与代理键形成多对一关系,同时还有一个数字遗留表的内容与复合唯一相关吗?
  2. 当复合键上的几个关系共享同一个组件时,该怎么办(Naselja:Korisnik / Opcina,Korisnik / Grad)? Hibernate告诉我,我不能两次使用相同的列(Korisnik),除非我将'updatable = false,insertable = false'添加到@JoinColumn注释中。然而,当我这样做时,我得到的信息是关系的所有组件必须具有可插入和可更新的相同设置。我如何更新或插入第二个关系?
  3. 在'Ulice'表中插入一行会给我一个错误“org.hibernate.AnnotationException:referencedColumnNames(Korisnik,Naselje)lc.data.hibernate.Ulice.naselja引用lc.data.hibernate.Naselja未映射到单个属性“除非在'Naselja'表中,我明确地在模型中向'Korisnici'表添加多对一关系,这不反映实际的数据库模式。
  4. 从我到目前为止所读到的JPA doesn't support relationships to non-primary keys,但是people still do it。也是我的第二个问题might be solved with Hibernate 5,但我希望能提出一些好的建议。这里有什么路线。

    测试模型,数据库脚本和项目:


    Database schema MSSQL

    MSSQL create database scripts

    Java NetBeans example projects

1 个答案:

答案 0 :(得分:2)

1) - 将自动增量列映射为主键 - 为compositeid创建类,并使用property-ref

映射多对一
    <component name="compIdProperty" unique="true">
      <property column="naselje" />
      <many-to-one column="korisnik" class="Korisnik"/>
    </component>

    <many-to-one name="Naselja" property-ref="compIdProperty">
      <column name="naselje" />
      <column name="korisnik" />
    </many-to-one>

2)AFAIK根本不可能使用hibernate

我看到的唯一可行方法是将(Grad,Opcina)映射为属性并自行管理关联

3)因为这是一个传统的架构,所以我会选择添加多对一,并将多对一映射到Opine和Gradovi的Korisnik