gpt4 book ai didi

java - Hibernate XML 映射 : Map abstract fields but not ID

转载 作者:行者123 更新时间:2023-12-01 12:37:58 26 4
gpt4 key购买 nike

我使用 Hibernate 4.3,使用 hmb.xml 文件,并且需要访问现有的 Oracle 数据库。

表格示例:

Dossier : 
id_dossier(int),
noDossier(int),
... ,
D_Crea(Date),
U_Crea(Varchar),
D_Maj(Date),
U_Maj(Varchar);
Adresse :
id_adresse(int),
rue(varchar),
...,
D_Crea(Date),
U_Crea(Varchar),
D_Maj(Date),
U_Maj(Varchar);
Contrat :
id_contrat(int),
d_signature(date),
...,
D_Crea(Date),
U_Crea(Varchar),
D_Maj(Date),
U_Maj(Varchar);

我无法更改数据库结构上的任何内容。

POJO:

abstract class CUObject{
private int id;
private Date createDate, updateDate;
private String createUser, updateUser;
}

class Dossier extends CUObject{
private String noDossier;
}

class Adresse extends CUObject{
private String rue;
}

class Contrat extends CUObject{
private Date signatureDate;
}

POJO 的结构可以更改。

阅读 Hibernate 文档后,映射此层次结构的最佳方法似乎是使用类和联合子类:

<class abstract="true" name="CUObject">
<id />
<property column="D_CREA" name="createDate"/>
<property column="D_MAJ" name="updateDate"/>
<property column="U_CREA" name="createDate"/>
<property column="U_MAJ" name="updateUser"/>

<union-subclass name="Dossier" table="DOSSIER" >
<property column="NO_DOSSIER" name="numDossier" />
</union-subclass>

<union-subclass name="Addresse" table="ADRESSE" >
<property column="RUE" name="rue" />
</union-subclass>

<union-subclass name="Contrat" table="CONTRAT" >
<property column="D_SIGNATURE" name="signatureDate" />
</union-subclass>
</class>

但是,正如文档中提到的,“所有子类表上的列名必须相同。联合子类继承中不允许使用标识生成器策略。主键种子必须在层次结构的所有联合子类之间共享”

这对我来说是一个问题:我需要为每个子类(oracle 序列)提供一个生成器策略,子类之间不共享主键,并且所有子类的主键名称不同。

还有什么其他方法可以映射 CU 字段,而无需在每个类的映射上进行可怕的复制/粘贴?

坦克很多。PS:我使用这个网站已经好几年了。我要感谢您迄今为止给我的所有答案。

最佳答案

我终于找到了一个可接受的解决方案,读取现有表并避免在映射文件中复制/粘贴:不在映射中声明继承,并使用 XML ENTITY 的概念来包含多次相同的标签。

映射.hmb.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"[
<!ENTITY genericProperties SYSTEM "{classPath}orm-mapping/genericProperties.xml">
]>
<hibernate-mapping>

<class name="aa.bb.ccc.shared.model.customer.Dossier" table="DOSSIER">
<id column="ID_DOSSIER" name="id">
<generator class="sequence-identity" >
<param name="sequence">SEQ_DOSSIER</param>
</generator>
</id>
&genericProperties;
<property column="NO_DOSSIER" generated="never" lazy="false" name="numDossier" />
</class>
</hibenate-mapping>

genericProperties.xml(没有 XML header 或文档类型,只有 RAW):

<property column="D_CREA" generated="never" lazy="false" name="createDate" type="timestamp"/>
<property column="D_MAJ" generated="never" lazy="false" name="updateDate" type="timestamp"/>
[...]

它可以完成工作,但我愿意接受更清洁的解决方案。

关于java - Hibernate XML 映射 : Map abstract fields but not ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25397740/

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