Hibernate:一个实体的几个表 - >继承hibernate-mapping

时间:2015-10-26 16:00:16

标签: java xml hibernate

我有一个实体,我希望在我的sql数据库中有几个表。

例如,我有一个Java类,其中我有另一个Java类的集合

@Entity
class SqlEntity{
    @Id
    @Column(unique = true)
    private Date date = null;
    @Column
    @OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL, CascadeType.PERSIST,
            CascadeType.MERGE }, mappedBy = "CollectionData")
    private Collection<CollectionData> collectionData = new ArrayList<>();

    @Column(name="columNameX")
    int attributeX;
    @Column(name="columNamey")
    int attributeY;
    ...
}

根据数据的来源,我想在不同的表中使用不同的数据: SQL_ENTITY_GERMANY, SQL_ENTITY_USA, SQL_ENTITY_UK, ...

我能够通过为每个表写一个xml-mapping来实现这一点(之前我只有java注释来映射实体)。 但是我必须为每个表写一个完整的映射:

<hibernate-mapping>
    <class name="...SqlEntity" table="SQL_ENTITY_GERMANY"
        entity-name="SQL_ENTITY_GERMANY">

        <id name="date" type="date" column="date">
        </id>

        <property name="columnNameX" column="attributeX" type="int" />
        <property name="columnNameY" column="attributeY" type="int" />
        ...

        <bag name="collectionData" cascade="all">
            <key column="date" />
            <one-to-many class="COLLECTION_DATA_GERMANY" />
        </bag>
    </class>

    <class name="...collectionData" table="COLLECTION_DATA_GERMANY"
        entity-name="COLLECTION_DATA_GERMANY">

        <id name="id" type="long" column="id">
            <generator class="native" />
        </id>

        <property name="columnNameX" column="attributeX" type="int" />
        <property name="columnNameY" column="attributeY" type="int" />
        ...
        <many-to-one name="collectionData" class="SQL_ENTITY_GERMANY"
            fetch="select">
            <column name="date" not-null="true" />
        </many-to-one>
    </class>
</hibernate-mapping>

因此,如果我想在一个实体类中更改任何内容(例如添加成员),我也必须在每个xml-mapping中更改它。

所以我认为可能只是继承映射,所以只要我不覆盖它,类的注释仍然有罪。 我试图google并在stackoverflow上搜索这个主题,但我发现只有java类继承的东西。 还是有其他解决方案可以帮助我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

由于您的数据库是非规范化的,实现所需内容的唯一方法是创建一个抽象类和几个具有适当国家/地区代码的具体子类。

如果您能够更改架构,我建议您在COUNTRY_CODE VARCHAR(2) NULL表中添加一列SQL_ENTITY,插入SQL_ENTITY_*表中的所有数据。

您可以通过以下方式实现:

1)创建一个新的SQL_ENTITY

CREATE TABLE NEW_SQL_ENTITY (
id_entity INTEGER NOT NULL AUTO_INCREMENT;
value1 VARCHAR(100) NOT NULL;
value2 VARCHAR(100) NOT NULL;
country_code VARCHAR(2) NULL;
)

2)插入其他表中的数据:

INSERT INTO NEW_SQL_ENTITY (value1,value2,country_code) VALUES
(SELECT value1,value2, 'UK' from SQL_ENTITY_UK)

3)重复所有SQL_ENTITY