如何将具有 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 SoundNotificationWithoutData
和 SoundNotificationWithData
,两个 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
注释更优雅。
我正在将应用程序从 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 SoundNotificationWithoutData
和 SoundNotificationWithData
,两个 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
注释更优雅。