首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA @MappedSuperclass和JPAMetaModelEntityProcessor

JPA @MappedSuperclass和JPAMetaModelEntityProcessor
EN

Stack Overflow用户
提问于 2017-08-15 02:04:31
回答 3查看 2K关注 0票数 2

我有以下设想:

1)带有复合PK的抽象@MappedSuperClass:

代码语言:javascript
复制
@MappedSuperclass
@EqualsAndHashCode(of = { "id" }, callSuper = false)
public abstract class LocalizedDetail {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @Getter
    @Setter
    private LocalePK id;
(...)

2)这是我的PK:

代码语言:javascript
复制
@Embeddable
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
public class LocalePK implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "ID", length = 256)
    @Getter
    @Setter
    private String id;

    @Column(name = "LOCALE", length = 16)
    @Getter
    @Setter
    private String locale;

}

3) LocalizedDetail子类:

代码语言:javascript
复制
@Entity
@Table(name = "BT_VALUE_OBJECT_INFO")
public class ValueObjectInfo extends LocalizedDetail {
(...)

4)利用org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor插件通过maven生成JPA元模型。

正在发生的情况是,生成LocalePK元模型时没有任何属性:

代码语言:javascript
复制
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(LocalePK.class)
public abstract class LocalePK_ {


}

但是,如果我将这个LocalePK设置为没有扩展LocalizedDetail的任何其他实体的复合PK,则会正确地生成它。我需要创建一个“假”实体类来生成这个元模型。

这个模型是否有任何已知的限制来生成正确的PK元模型?

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-27 14:23:20

这看起来是当前hibernate jpa模型的一个bug。参考资料可以在这里找到(https://hibernate.atlassian.net/browse/HHH-8714)。我发现Hibernate 5.2也是如此

我目前所做的一项工作是在仍然使用hibernate库的同时,将hibernate jpa模型元移出eclipse链接。

我已经用我使用的主要hibernate库进行了测试。

结果是完全构造的类,但它也为扩展生成超类_文件。我发现在条件api (例如AbstractBaseEntity vs InheritingEntity)中使用这个超类时,字段是不填充的,总是为空的。始终确保通过继承类引用类型化属性。例如InheritingEntity.createdTime_

希望这能帮上忙吗

致以亲切的问候,

代码语言:javascript
复制
```javascript
代码语言:javascript
复制
<!-- Hibernate -->
代码语言:javascript
复制
<dependency>
代码语言:javascript
复制
    <groupId>org.hibernate</groupId>
代码语言:javascript
复制
    <artifactId>hibernate-core</artifactId>
代码语言:javascript
复制
    <version>5.2.12.Final</version>
代码语言:javascript
复制
    <type>jar</type>
代码语言:javascript
复制
    <scope>test</scope>
代码语言:javascript
复制
</dependency>
代码语言:javascript
复制
<dependency>
代码语言:javascript
复制
    <groupId>org.hibernate</groupId>
代码语言:javascript
复制
    <artifactId>hibernate-validator</artifactId>
代码语言:javascript
复制
    <version>5.4.2.Final</version>
代码语言:javascript
复制
    <type>jar</type>
代码语言:javascript
复制
</dependency>
代码语言:javascript
复制
<dependency>
代码语言:javascript
复制
    <groupId>org.hibernate</groupId>
代码语言:javascript
复制
    <artifactId>hibernate-annotations</artifactId>
代码语言:javascript
复制
    <version>3.5.6-Final</version>
代码语言:javascript
复制
    <type>jar</type>
代码语言:javascript
复制
    <scope>test</scope>
代码语言:javascript
复制
</dependency>
代码语言:javascript
复制
<dependency>
代码语言:javascript
复制
    <groupId>org.hibernate.javax.persistence</groupId>
代码语言:javascript
复制
    <artifactId>hibernate-jpa-2.1-api</artifactId>
代码语言:javascript
复制
    <version>1.0.0.Final</version>
代码语言:javascript
复制
    <type>jar</type>
代码语言:javascript
复制
    <scope>test</scope>
代码语言:javascript
复制
</dependency>
代码语言:javascript
复制
<dependency>
代码语言:javascript
复制
    <groupId>org.hibernate</groupId>
代码语言:javascript
复制
    <artifactId>hibernate-c3p0</artifactId>
代码语言:javascript
复制
    <version>5.2.12.Final</version>
代码语言:javascript
复制
    <type>jar</type>
代码语言:javascript
复制
    <scope>test</scope>
代码语言:javascript
复制
</dependency>
代码语言:javascript
复制
<dependency>
代码语言:javascript
复制
    <groupId>org.eclipse.persistence</groupId>
代码语言:javascript
复制
    <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
代码语言:javascript
复制
    <version>2.7.0</version>
代码语言:javascript
复制
</dependency>
代码语言:javascript
复制
<!--
代码语言:javascript
复制
    Cant use hibernate jpa model gen cause of https://hibernate.atlassian.net/browse/HHH-8714
代码语言:javascript
复制
<dependency>
代码语言:javascript
复制
    <groupId>org.hibernate</groupId>
代码语言:javascript
复制
    <artifactId>hibernate-jpamodelgen</artifactId>
代码语言:javascript
复制
    <version>5.2.12.Final</version>
代码语言:javascript
复制
    <type>jar</type>
代码语言:javascript
复制
    <scope>test</scope>
代码语言:javascript
复制
</dependency>-->
代码语言:javascript
复制
<dependency>
代码语言:javascript
复制
    <groupId>jaxen</groupId>
代码语言:javascript
复制
    <artifactId>jaxen</artifactId>
代码语言:javascript
复制
    <version>1.1.6</version>
代码语言:javascript
复制
    <type>jar</type>
代码语言:javascript
复制
    <scope>test</scope>
代码语言:javascript
复制
</dependency>
代码语言:javascript
复制
票数 1
EN

Stack Overflow用户

发布于 2018-03-13 09:21:36

根据Java持久化与Hibernate,第二版

@MappedSuperClass

不是个好办法。考虑使用

@Inheritance(stragety = TABLE_PER_CLASS)

而不是。

票数 0
EN

Stack Overflow用户

发布于 2020-11-12 08:06:16

实际上,我找到了一个5.4.23版更新的解决方案--我希望这对更多的人有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45685521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档