Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HibernateXML映射:映射抽象字段,但不映射ID_Java_Hibernate_Hibernate Mapping - Fatal编程技术网

Java HibernateXML映射:映射抽象字段,但不映射ID

Java HibernateXML映射:映射抽象字段,但不映射ID,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我使用Hibernate4.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), .

我使用Hibernate4.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字段而不在每个类的映射上进行可怕的复制/粘贴

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

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

Mapping.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头或doctype,只是原始文件):


[...]

它可以完成这项工作,但我愿意接受更干净的解决方案。

搜索“MappedSuperclass”,我在其中找不到任何未共享id的示例(表和生成策略)@MappedSuperclass与
<property column="D_CREA" generated="never" lazy="false" name="createDate" type="timestamp"/>
<property column="D_MAJ" generated="never" lazy="false" name="updateDate" type="timestamp"/>
[...]