如何将具有2个实体名称的同一类迁移到Spring Data JPA?

时间:2015-01-23 16:13:37

标签: java hibernate jpa spring-data

我正在从Hibernate将应用程序迁移到Spring Data JPA。我已经迁移了一些存储库并使其正常工作。我现在有一个需要转换的特殊情况。

我的.hbm.xml中有这个:

<class name="SoundNotification" table="SoundNotification" entity-name="SoundNotificationWithData">
        <id name="m_id" type="int" column="id" unsaved-value="-1">
            <generator class="native"/>
        </id>
        <property name="m_name" column="name" unique="true" not-null="true"/>
        <property name="m_data" column="data"
                  type="com.traficon.tmsng.server.common.service.persistence.impl.hibernate.usertype.BlobUserType"
                  not-null="true"/>
        <property name="m_size" formula="OCTET_LENGTH(data)"/>
        <property name="m_inUse"
                  formula="(select count(1) from EventTypeConfiguration etc where etc.soundNotification=id)"/>
    </class>

    <class name="SoundNotification" table="SoundNotification" entity-name="SoundNotificationWithoutData">
        <id name="m_id" type="int" column="id" unsaved-value="-1">
            <generator class="native"/>
        </id>
        <property name="m_name" column="name" unique="true" not-null="true"/>
        <property name="m_size" formula="OCTET_LENGTH(data)"/>
        <property name="m_inUse"
                  formula="(select count(1) from EventTypeConfiguration etc where etc.soundNotification=id)"/>
    </class>

注意我只有1个SoundNotification个类,但它与2个不同的entity-name一起使用(SoundNotificationWithData和SoundNotificationWithoutData)

是否可以将其转换为Spring Data JPA?我是否需要创建2个java类作为&#34;解决方法&#34; ?

我们的另一个例子就是这个:

<class name="FlowDataMessageImpl" entity-name="FlowDataPer10s" table="FlowDataPer10s">
...
</class>

<class name="FlowDataMessageImpl" entity-name="FlowDataPer20s" table="FlowDataPer20s">
....
</class>
<class name="FlowDataMessageImpl" entity-name="FlowDataPer2m" table="FlowDataPer2m">
...
</class>

这里我们存储相同的&#34; Java对象&#34;在我们做了一些汇总计算后,在不同的表格中。我想用JPA来映射这个(或者有人告诉我这是一个坏主意,我应该像以前一样直接使用Hibernate)

1 个答案:

答案 0 :(得分:2)

对于您的第一个问题:您将必须创建两个Java类SoundNotificationWithoutDataSoundNotificationWithData,这两个类使用@Inheritance(strategy=InheritanceType.SINGLE_TABLE)扩展相同的第三个Java类,并使用{{映射3}}注释。另请注意,您无法在纯JPA 中创建具有公式(属性m_inUse)的属性,因此您必须使用特定于Hibernate的内容或仅在加载该属性时你需要它。

对于你的第二个问题:再次使用Hibernate特定的东西,或者在超类上使用@Table(name="SoundNotification")注释(由每个FlowDataPer*类扩展),而不使用它{{ 1}}和@Entity注释。当然,您也可以使用与第一个问题相同的解决方案:不同的类(@InheritanceFlowDataPer10s,...)扩展基本实体类,使用FlowDataPer20s和{{1但是我发现@Entity注释更加优雅。