是否可以向超类示例变量添加JPA注解?

qyzbxkaa  于 2022-11-14  发布在  其他
关注(0)|答案(5)|浏览(149)

我正在为两个不同的表创建相同的实体。为了使两个实体的表Map等不同,但只在一个地方有代码的其余部分-一个抽象超类。最好的事情是能够注解通用的东西,如列名(因为将是相同的),但这不起作用,因为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
}

我想继承它,只指定特定于孩子的内容,如注解:

@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;

}

有什么想法吗?我是否必须在子类中创建字段、getter和setter?
谢谢,克里斯

56lgkhnf

56lgkhnf1#

你可能想用@MappedSuperclass类来标注MyAbstractEntity,这样Hibernate就可以导入MyAbstractEntity的配置到子类中,而你不必覆盖这个字段,只需要使用父类的字段。这个标注是一个信号,告诉Hibernate它也必须检查父类。否则它会认为它可以忽略它。

ruarlubt

ruarlubt2#

下面是一个示例,其中的一些解释可能会有所帮助。
@MappedSuperclass

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

@Inheritance指定以下三种Map策略之一:
1.单表
1.已加入
1.每个类的表
@DiscriminatorColumn用于定义将使用哪个列来区分子对象。
@DiscriminatorValue用于指定用来区分子对象的值。
下列程式码会产生下列结果:

您可以看到id字段在两个表中都有,但只在AbstractEntityId @MappedSuperclass中指定。
此外,@DisciminatorColumn在“交易方”表中显示为PARTY_TYPE。
@DiscriminatorValue在当事人表的PARTY_TYPE列中显示为Person记录。
非常重要的是,AbstractEntityId类根本不会持久化。
我没有指定@Column注解,而是只依赖于默认值。
如果您添加了一个扩展了“交易方”的组织实体,并且该实体接下来被保留,则“交易方”表将具有:

  • 标识符= 2
  • 交易方类型=“组织”

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

  • 标识符= 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.
     
    }

希望这对你有帮助:)

yx2lnoni

yx2lnoni3#

将超类标记为

@MappedSuperclass

并从子类中删除该属性。

aij0ehis

aij0ehis4#

使用@MappedSuperclass注解基类应该可以完全满足您的需要。

yqyhoc1h

yqyhoc1h5#

这是旧的,但我最近处理了这个问题,并希望分享我的解决方案。
第一个

相关问题