gpt4 book ai didi

hibernate-mapping - 如何将 "insert=' false' update ='false' "映射到也在一对多 FK 中使用的复合 ID 键属性上?

转载 作者:行者123 更新时间:2023-12-03 07:08:20 26 4
gpt4 key购买 nike

我正在使用现有数据库架构开发遗留代码库。现有代码使用 SQL 和 PL/SQL 在数据库上执行查询。我们的任务是使项目的一小部分与数据库引擎无关(首先,最终改变所有内容)。我们选择使用 Hibernate 3.3.2.GA 和“*.hbm.xml”映射文件(而不是注释)。不幸的是,更改现有架构是不可行的,因为我们无法回归任何旧功能。

我遇到的问题是当我尝试映射单向、一对多关系时,其中 FK 也是复合 PK 的一部分。这是类和映射文件...

CompanyEntity.java

public class CompanyEntity {
private Integer id;
private Set<CompanyNameEntity> names;
...
}

CompanyNameEntity.java

public class CompanyNameEntity implements Serializable {
private Integer id;
private String languageId;
private String name;
...
}

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>

此代码对于具有名称的公司的 SELECT 和 INSERT 效果很好。当我尝试更新现有记录时遇到问题。我收到了 BatchUpdateException,在查看 SQL 日志后,我发现 Hibernate 正在尝试做一些愚蠢的事情...

update COMPANY_NAME set COMPANY_ID=null where COMPANY_ID=?

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>

此映射给出了异常(exception)...

org.hibernate.MappingException: Repeated column in mapping for entity: companyName column: COMPANY_ID (should be mapped with insert="false" update="false")

我现在的问题是,我尝试将这些属性添加到 key-property 元素,但 DTD 不支持。我也尝试将其更改为键多对一元素,但这也不起作用。所以...

如何将“insert='false' update='false'”映射到也在一对多 FK 中使用的复合 ID 键属性上?

最佳答案

我认为您正在寻找的注释是:

public class CompanyName implements Serializable {
//...
@JoinColumn(name = "COMPANY_ID", referencedColumnName = "COMPANY_ID", insertable = false, updatable = false)
private Company company;

您应该能够在 hbm.xml 中使用类似的映射,如下所示(在 23.4.2 中):

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/example-mappings.html

关于hibernate-mapping - 如何将 "insert=' false' update ='false' "映射到也在一对多 FK 中使用的复合 ID 键属性上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4892925/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com