是否可以将JPA注释添加到超类实例变量中?

Kri*_*fer 26 java inheritance annotations jpa

我正在为两个不同的表创建相同的实体.为了使两个实体的表映射等不同,但只将其余的代码放在一个地方 - 一个抽象的超类.最好的方法是能够在超类中注释诸如列名之类的通用内容(因为它们将是相同的),但这不起作用,因为JPA注释不是由子类继承的.这是一个例子:

public abstract class MyAbstractEntity {

  @Column(name="PROPERTY") //This will not be inherited and is therefore useless here
  protected String property;


  public String getProperty() {
    return this.property;
  }

  //setters, hashCode, equals etc. methods
}
Run Code Online (Sandbox Code Playgroud)

我想继承哪个,只指定特定于孩子的东西,比如注释:

@Entity
@Table(name="MY_ENTITY_TABLE")
public class MyEntity extends MyAbstractEntity {

  //This will not work since this field does not override the super class field, thus the setters and getters break.
  @Column(name="PROPERTY") 
  protected String property;

}
Run Code Online (Sandbox Code Playgroud)

任何想法或我是否必须在子类中创建字段,getter和setter?

谢谢,克里斯

sbl*_*ndy 26

您可能希望使用@MappedSuperclass类注释MyAbstractEntity,以便hibernate将在子项中导入MyAbstractEntity的配置,您不必重写该字段,只需使用父项.该注释是休眠的信号,它必须检查父类.否则它假定它可以忽略它.

  • (挑选)他什么都不说冬眠,是吗?他可能会使用不同的JPA提供商.但当然你的推理仍适用 (5认同)

Way*_*rer 13

以下是一些可能有所帮助的解释示例.

@MappedSuperclass:

  • 是一个方便的类
  • 用于存储子类可用的共享状态和行为
  • 不是坚持不懈的
  • 只有子类才能持久化

@Inheritance指定三种映射策略之一:

  1. 单表
  2. 加盟
  3. 每班表

@DiscriminatorColumn用于定义将用于区分子对象的列.

@DiscriminatorValue用于指定用于区分子对象的值.

以下代码导致以下内容:

在此输入图像描述

您可以看到id字段在两个表中,但仅在AbstractEntityId @MappedSuperclass中指定.

此外,@ DiscisatorColumn在Party表中显示为PARTY_TYPE.

@DiscriminatorValue在Party表的PARTY_TYPE列中显示为Person作为记录.

非常重要的是,AbstractEntityId类根本不会持久存在.

我没有指定@Column注释,而只是依赖于默认值.

如果您添加了一个扩展Party的组织实体,并且如果该实体是下一个持久化的,那么Party表将具有:

  • id = 2
  • PARTY_TYPE ="组织"

组织表第一个条目将具有:

  • id = 2
  • 与组织特定关联的其他属性值

    @MappedSuperclass
    @SequenceGenerator(name = "sequenceGenerator", 
            initialValue = 1, allocationSize = 1)
    public class AbstractEntityId implements Serializable {

        private static final long serialVersionUID = 1L;

        @Id
        @GeneratedValue(generator = "sequenceGenerator")
        protected Long id;

        public AbstractEntityId() {}

        public Long getId() {
            return id;
        }
    }

    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    @DiscriminatorColumn(name = "PARTY_TYPE", 
            discriminatorType = DiscriminatorType.STRING)
    public class Party extends AbstractEntityId {

        public Party() {}

    }

    @Entity
    @DiscriminatorValue("Person")
    public class Person extends Party {

        private String givenName;
        private String familyName;
        private String preferredName;
        @Temporal(TemporalType.DATE)
        private Date dateOfBirth;
        private String gender;

        public Person() {}

        // getter & setters etc.

    }

希望这可以帮助 :)