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

标签 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 类作为“解决方法”?

另一个例子是这个:

<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 对象”存储在不同的表中。我想使用 JPA 映射它(或者有人告诉我这是个坏主意,我应该像以前一样直接使用 Hibernate)

最佳答案

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

对于你的第二个问题:同样,要么使用特定于 Hibernate 的东西,要么使用 @MappedSuperclass父类(super class)上的注释(由每个 FlowDataPer* 类扩展),而不在其上使用 @Entity@Inheritance 注释。当然,您也可以使用与第一个问题相同的解决方案:不同的类(FlowDataPer10sFlowDataPer20s、..)扩展一个基础实体类,用 注释@Entity@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS),但我发现使用 @MappedSuperclass 注释更优雅。

关于java - 如何将具有 2 个实体名称的相同类迁移到 Spring Data JPA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28114064/

相关文章:

java - 如何强制重新加载实体?

java - 错误在哪里?寻找多数

java - 如何自定义 JComboBox 以便弹出窗口是 JTree(而不是列表)?

java - PostgreSQL 序列的 increment_by 如何与 Hibernate 的 allocationSize 一起工作?

java - hibernate条件查询创建多个sql

java - 从列表中删除后,JPA 枚举集未在数据库中更新

java - 文件因重音符号而被截断

Java 嵌套 ArrayList 返回对象

java - 是什么导致 "NoSuchMethodError: org.springframework.beans.BeanWrapper.setAutoGrowCollectionLimit(I)V?"

java - 父子关系实现