当键名称不同时 Hibernate 一对一关联

标签 hibernate one-to-one composite-primary-key

我有两个表,其复合 ID 具有一对一的关系。

表一:PK 列:column1、column2 表二:PK 列:第 3 列、第 4 列。

列具有不同的名称。我必须将column1 映射到column3,将column2 映射到column4。 表1(父表)声明:

<class name="com.java.TABLE1" table="TABLE1">
        <composite-id name="TABLE1_pk" class="com.tc4.dal.TABLE1_PK">
            <key-property name="COLUMN1" column="COLUMN1" />
            <key-property name="COLUMN2" column="COLUMN3" />
        </composite-id>
...remaining properties declarations...

<one-to-one name="TABLE2" class="com.tc4.dal.TABLE2"
            cascade="save-update, delete">
             <key column="COLUMN3" property-ref="COLUMN1" />
            <key column="COLUMN4" property-ref="COLUMN2" />
</one-to-one> 
</class>

表2(子表)映射

<class name="com.java.TABLE2" table="TABLE2">
        <composite-id name="TABLE2_pk" class="com.tc4.dal.TABLE2_PK">
            <key-property name="COLUMN3" column="COLUMN3" />
            <key-property name="COLUMN4" column="COLUMN4" />
        </composite-id>
</class>

启动应用程序时,出现以下异常

  Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from resource com/JAVA/TABLE1.hbm.xml
    Caused by: org.xml.sax.SAXParseException: The content of element type "one-to-one" must match "(meta*,formula*)".
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:196)
    at org.apache.xerces.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:132)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:390)

如何在这种情况下在映射文件中给出一对一关联。

问候, 纳雷什。

最佳答案

通过注释,你可以像表 1 中这样实现

 @OneToOne(targetEntity = TABLE2.class, fetch = FetchType.LAZY)
   @JoinColumns(value = {
         @JoinColumn(name = "COLUMN1", referencedColumnName = "COLUMN3"),
         @JoinColumn(name = "COLUMN2", referencedColumnName = "COLUMN4") })
  TABLE2 table2

使用 XMl 尝试一下并让我知道

<class name="com.java.TABLE1" table="TABLE1">
        <composite-id name="TABLE1_pk" class="com.tc4.dal.TABLE1_PK">
            <key-property name="COLUMN1PROP" column="COLUMN1" />
            <key-property name="COLUMN2PROP" column="COLUMN3" />
        </composite-id>
...remaining properties declarations...

<one-to-one name="TABLE2" class="com.tc4.dal.TABLE2"
            cascade="save-update, delete">
             <key column="COLUMN1PROP" property-ref="COLUMN3PROP" />
            <key column="COLUMN2PROP" property-ref="COLUMN4PROP" />
</one-to-one> 
</class>

<class name="com.java.TABLE2" table="TABLE2">
        <composite-id name="TABLE2_pk" class="com.tc4.dal.TABLE2_PK">
            <key-property name="COLUMN3PROP" column="COLUMN3" />
            <key-property name="COLUMN4PROP" column="COLUMN4" />
        </composite-id>
</class>

或者

<class name="com.java.TABLE1" table="TABLE1">
        <composite-id name="TABLE1_pk" class="com.tc4.dal.TABLE1_PK">
            <key-property name="COLUMN1PROP" column="COLUMN1" />
            <key-property name="COLUMN2PROP" column="COLUMN3" />
        </composite-id>
...remaining properties declarations...

<one-to-one name="TABLE2" class="com.tc4.dal.TABLE2"
            cascade="save-update, delete">
             <key column="COLUMN1" property-ref="COLUMN3PROP" />
            <key column="COLUMN2" property-ref="COLUMN4PROP" />
</one-to-one> 
</class>

<class name="com.java.TABLE2" table="TABLE2">
        <composite-id name="TABLE2_pk" class="com.tc4.dal.TABLE2_PK">
            <key-property name="COLUMN3PROP" column="COLUMN3" />
            <key-property name="COLUMN4PROP" column="COLUMN4" />
        </composite-id>
</class>

让我知道哪一个有效。 :)

关于当键名称不同时 Hibernate 一对一关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16260928/

相关文章:

sql - PostgreSQL:表仅引用复合主键的一部分

java - 如何从 Hibernate HQL (oracle) 可视化 SQL?

json - 如何使用 @JsonManagedReference 和 @JsonBackReference 映射 POJO 之间的 OneToOne 关系

Nhibernate 一对一映射问题与子对象插入错误

postgresql - 在 postgres 中有很多序列有什么问题吗?

mysql - Oracle MySQL : Cannot add foreign key constraint

java - 如果使用密码,Hibernate无法登录MySQL

java - 来自 db 乐观字段的 Netbeans 实体类

java - 当事务只读取数据时,是否应该避免使用注解@Transactional?

java - 在 hibernate 中使用 onetoone 共享 pk