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

How to migrate same class with 2 entity-names to Spring Data JPA?

我正在将应用程序从 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 个 class SoundNotification,但它与 2 个不同的 entity-name 一起使用(SoundNotificationWithData 和 SoundNotificationWithoutData)

是否可以将其转换为 Spring Data JPA?我需要创建 2 java classes 作为 "workaround" 吗?

另一个例子是这个:

<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>

在这里,我们在进行一些汇总计算后将相同的 "Java object" 存储在不同的表中。我想使用 JPA 映射它(或者有人告诉我这是个坏主意,我应该像以前一样直接使用 Hibernate)

关于你的第一个问题:你必须创建两个 Java classes SoundNotificationWithoutDataSoundNotificationWithData,两个 classes 扩展相同的第三个Java class,使用 @Inheritance(strategy=InheritanceType.SINGLE_TABLE) and mapped with the @Table(name="SoundNotification") 注释。另请注意,您将无法 在普通 JPA 中创建带有公式 (属性 m_inUse) 的 属性,因此您将不得不使用特定于 Hibernate 的内容或仅在需要时加载 属性。

对于你的第二个问题:同样,要么使用特定于 Hibernate 的东西,要么在 superclass 上使用 @MappedSuperclass 注释(每个 FlowDataPer* classes),而不在其上使用 @Entity@Inheritance 注释。当然,您也可以使用与第一个问题相同的解决方案:不同的 classes (FlowDataPer10s, FlowDataPer20s, ..) extending a base entity class, anntoated with @Entity@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS),但我发现使用 @MappedSuperclass 注释更优雅。