【问题标题】:Hibernate One to One Association when key names are different当键名不同时休眠一对一关联
【发布时间】:2013-04-22 01:45:41
【问题描述】:

我有两个具有一对一关系的复合 id 表。

表一:PK 列:column1,column2 表二:PK列:column3,column4。

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

<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>

Table2(子表)映射

<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)

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

问候, 纳雷什。

【问题讨论】:

  • 您能否展示其他映射细节,例如您如何映射复合 ID?
  • 根据问题LNBCPRODHDRP0 具有键列名称BC_BANK_ID, BC_BRANCH_ID, BC_PRODUCT_NBR 但在您的情况下LNBCPRODHDRP0_pk 指的是LC_BANK_ID, LC_BRANCH_ID, LC_PRODUCT_NBR 另外请编辑原始问题以添加此信息。不要在 cmets 中给出代码。
  • @rahul maindargi,我已经编辑了我的问题。你能检查一下吗
  • 你使用的是哪个版本的休眠?
  • @Rahul,我使用的是休眠 3.3

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


【解决方案1】:

重命名子表复合键列,因为它们在父表中已经解决了这个问题。 详细说明:- - 父表(TABLE1):

<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
    </class>

//由于TABLE1有composit key,需要为TABLE1创建主键POJO

public class TABLE1_PK {
    public String COLUMN1Prop;
    public String COLUMN2Prop;
  }

TABLE1 实体:

public class TABLE1{
  // declare PK
  private TABLE1_PK TABLE1_pk;
// getters and setters and remaining properties
}
  • 子表(TABLE2):

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

子实体PK

public class TABLE2_PK{
// here property names should be defined as parent Entity properties
        public String COLUMN1Prop;
        public String COLUMN2Prop;
.. getters and setters
}

【讨论】:

    【解决方案2】:

    带有注释你可以像这样实现它..在表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>
    

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

    【讨论】:

    • 嗨拉胡尔,感谢您的回复。我正在使用基于 xml 的映射。我已经尝试了您的第二种情况,但仍然导致异常。我怀疑您的第一个案例是否可行,因为这里的列标记应该引用列()
    • @rahul maindargi,有什么 cmets 或其他建议吗??
    • 好吧,我也在搜索和浏览休眠文档。我一找到东西就会更新答案:)
    • @rahul maindargi,非常感谢
    • 你刚刚拯救了我这两天的困惑。谢谢!顺便说一句,我正在使用 xml 映射.. 与您建议的“property-ref”。但就我而言,这是多对一的关系,我将“property-ref”放在 标签
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多