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

Hibernate-将复合关系映射到非主键,hibernate,nhibernate,jpa,nhibernate-mapping,Hibernate,Nhibernate,Jpa,Nhibernate Mapping,我必须映射一个大型企业数据库模式。由于许多遗留应用程序都依赖于该模式,因此我无法将其从复合键更改为代理键(除了对约70%的数据库对象使用带有instead of触发器的视图),这导致我遇到了许多不知道如何克服的问题 如何映射具有代理项(主、自动递增)键和复合唯一键的表,其中多个表在代理项键上形成多对一关系,同时多个旧表在复合唯一键上形成关系 当组合键上的多个关系共享同一组件(Naselja:Korisnik/Opcina、Korisnik/Grad)时,该怎么办? Hibernate告诉我不能使

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

  • 如何映射具有代理项(主、自动递增)键和复合唯一键的表,其中多个表在代理项键上形成多对一关系,同时多个旧表在复合唯一键上形成关系
  • 当组合键上的多个关系共享同一组件(Naselja:Korisnik/Opcina、Korisnik/Grad)时,该怎么办? Hibernate告诉我不能使用同一列(Korisnik)两次,除非我在@JoinColumn注释中添加'Updateable=false,insertable=false'。然而,当我这样做时,我得到的信息是,关系的所有组件都必须具有相同的可插入和可更新设置。我如何更新或插入第二个关系呢
  • 在“Ulice”表中插入一行会给我一个错误“org.hibernate.AnnotationException:lc.data.hibernate.Ulice.naselja referenced lc.data.hibernate.naselja的referenced columnnames(Korisnik,Naselje)referenced lc.data.hibernate.naselja未映射到单个属性”,除非在“naselja”表中我在模型中显式地向“Korisnici”表添加多对一关系,这并不反映实际的数据库模式
  • 从目前为止我读到的,但是。这也是我的第二个问题,但我希望能得到一些好的建议,在这里该走哪条路

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


    1) -将自动递增列映射为主键 -为compositeid创建类,并使用属性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) 恐怕根本不可能使用hibernate

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


    3) 由于这是一个遗留模式,我会折衷地将多对一相加,并将多对一映射到Opcine和Gradovi中的Korisnik

    我的一个想法是,在所有Hibernate关系上设置Updateable=false,insertable=false,显式映射表中的每个字段并手动处理关系。。。这是可行的,但似乎非常错误:)因此,如果我以这种方式手动管理关联,是否有Hibernate的问题我应该知道?对于Hibernate不知道的事情,它不能干预。我现在发现,所有的抓取都是在这样映射时被迫进行的;有什么方法可以避免这种行为吗?除了不映射关联和手动管理之外否,因为NH需要引用对象的标识,而在使用property ref时,该标识不存在