如何在复合id键属性上映射"insert ='false'update ='false'",该属性也用于一对多FK?

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