我正在将一个应用程序从 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 类 SoundNotificationWithoutData
和 SoundNotificationWithData
,这两个类都使用 @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
扩展相同的第三个 Java 类。并映射为 @Table(name="SoundNotification")
注解。另请注意,您将无法在纯 JPA 中 创建具有公式的属性(属性 m_inUse
),因此您将不得不使用特定于 Hibernate 的内容或加载仅在您需要时使用。
对于你的第二个问题:同样,要么使用特定于 Hibernate 的东西,要么使用 @MappedSuperclass父类(super class)上的注释(由每个 FlowDataPer*
类扩展),而不在其上使用 @Entity
和 @Inheritance
注释。当然,您也可以使用与第一个问题相同的解决方案:不同的类(FlowDataPer10s
、FlowDataPer20s
、..)扩展一个基础实体类,用 注释@Entity
和 @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
,但我发现使用 @MappedSuperclass
注释更优雅。
关于java - 如何将具有 2 个实体名称的相同类迁移到 Spring Data JPA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28114064/