我有两个表,其复合 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/