我正在从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)
答案 0 :(得分:2)
对于您的第一个问题:您将必须创建两个Java类SoundNotificationWithoutData
和SoundNotificationWithData
,这两个类使用@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
扩展相同的第三个Java类,并使用{{映射3}}注释。另请注意,您无法在纯JPA 中创建具有公式(属性m_inUse
)的属性,因此您必须使用特定于Hibernate的内容或仅在加载该属性时你需要它。
对于你的第二个问题:再次使用Hibernate特定的东西,或者在超类上使用@Table(name="SoundNotification")
注释(由每个FlowDataPer*
类扩展),而不使用它{{ 1}}和@Entity
注释。当然,您也可以使用与第一个问题相同的解决方案:不同的类(@Inheritance
,FlowDataPer10s
,...)扩展基本实体类,使用FlowDataPer20s
和{{1但是我发现@Entity
注释更加优雅。