Jes*_*ebb 41 hbm hibernate-mapping hbmxml hibernate-onetomany
我正在使用现有的数据库架构处理遗留代码库.现有代码使用SQL和PL/SQL在DB上执行查询.我们的任务是使项目数据库引擎不可知的一小部分(最初,最终改变一切).我们选择使用Hibernate 3.3.2.GA和"*.hbm.xml"映射文件(而不是注释).遗憾的是,更改现有架构是不可行的,因为我们无法回退任何遗留功能.
我遇到的问题是当我试图映射单向,一对多的关系时,FK 也是复合PK的一部分.这是类和映射文件......
CompanyEntity.java
public class CompanyEntity {
private Integer id;
private Set<CompanyNameEntity> names;
...
}
Run Code Online (Sandbox Code Playgroud)
CompanyNameEntity.java
public class CompanyNameEntity implements Serializable {
private Integer id;
private String languageId;
private String name;
...
}
Run Code Online (Sandbox Code Playgroud)
CompanyNameEntity.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.jboss.org/dtd/hibernate/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example">
<class name="com.example.CompanyEntity" table="COMPANY">
<id name="id" column="COMPANY_ID"/>
<set name="names" table="COMPANY_NAME" cascade="all-delete-orphan" fetch="join" batch-size="1" lazy="false">
<key column="COMPANY_ID"/>
<one-to-many entity-name="vendorName"/>
</set>
</class>
<class entity-name="companyName" name="com.example.CompanyNameEntity" table="COMPANY_NAME">
<composite-id>
<key-property name="id" column="COMPANY_ID"/>
<key-property name="languageId" column="LANGUAGE_ID"/>
</composite-id>
<property name="name" column="NAME" length="255"/>
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
此代码适用于具有名称的公司的SELECT和INSERT.我尝试更新和现有记录时遇到了问题.我收到了一个BatchUpdateException,在浏览了SQL日志之后,我看到Hibernate试图做一些愚蠢的事......
update COMPANY_NAME set COMPANY_ID=null where COMPANY_ID=?
Run Code Online (Sandbox Code Playgroud)
在更新子记录之前,Hibernate试图将子记录关联起来.问题是这个字段是PK的一部分而不是可空的.我发现快速解决方案使Hibernate不这样做是为了将"not-null ='true'"添加到父映射中的"key"元素.现在可能映射看起来像这样......
CompanyNameEntity.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.jboss.org/dtd/hibernate/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example">
<class name="com.example.CompanyEntity" table="COMPANY">
<id name="id" column="COMPANY_ID"/>
<set name="names" table="COMPANY_NAME" cascade="all-delete-orphan" fetch="join" batch-size="1" lazy="false">
<key column="COMPANY_ID" not-null="true"/>
<one-to-many entity-name="vendorName"/>
</set>
</class>
<class entity-name="companyName" name="com.example.CompanyNameEntity" table="COMPANY_NAME">
<composite-id>
<key-property name="id" column="COMPANY_ID"/>
<key-property name="languageId" column="LANGUAGE_ID"/>
</composite-id>
<property name="name" column="NAME" length="255"/>
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
这种映射给出了例外......
org.hibernate.MappingException: Repeated column in mapping for entity: companyName column: COMPANY_ID (should be mapped with insert="false" update="false")
Run Code Online (Sandbox Code Playgroud)
我现在的问题是我已经尝试将这些属性添加到key-property元素,但DTD不支持.我也尝试将它改为一个多对一的关键元素,但这也不起作用.所以...
如何在复合id键属性上映射"insert ='false'update ='false'",该属性也用于一对多FK?
mcy*_*cin 85
我认为您正在寻找的注释是:
public class CompanyName implements Serializable {
//...
@JoinColumn(name = "COMPANY_ID", referencedColumnName = "COMPANY_ID", insertable = false, updatable = false)
private Company company;
Run Code Online (Sandbox Code Playgroud)
你应该能够在hbm.xml中使用类似的映射,如下所示(在23.4.2中):
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/example-mappings.html
归档时间: |
|
查看次数: |
132001 次 |
最近记录: |