2010-05-21 2 views
21

Я создаю сущности, которые одинаковы для двух разных таблиц. Для того, чтобы сопоставления таблиц и т. Д. Отличались для двух объектов, но только остальная часть кода в одном месте - абстрактный суперкласс. Лучше всего было бы уметь комментировать общие вещи, такие как имена столбцов (поскольку они будут идентичными) в суперклассе, но это не работает, потому что аннотации 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 
} 

который я хотел бы, чтобы наследовать и только указать ребенку конкретные вещи, как аннотации:

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

} 

Любые идеи, или мне придется создавать поля, методы получения и установки в детских классах?

Спасибо, Kris

ответ

24

Возможно, вы захотите аннотировать MyAbstractEntity классом @MappedSuperclass, чтобы спящий режим импортировал конфигурацию MyAbstractEntity в дочернем элементе, и вам не придется переопределять это поле, просто используйте родительский элемент. Эта аннотация - это сигнал спящего режима, что он также должен изучить родительский класс. В противном случае он предполагает, что он может его игнорировать.

+3

(придирки), он ничего не сказал о спячках, не так ли? он может использовать другого поставщика JPA. но, конечно, ваши рассуждения применяются, тем не менее, –

+0

И я фактически использую спящий режим, просто забыл сказать так :) – Kristofer

2

аннотирования базовый класс с @MappedSuperclass должен делать именно то, что вы хотите.

3

Марк суперкласс, как

@MappedSuperclass 

и удалить свойство из класса ребенка.

12

Вот пример с некоторыми пояснениями, которые могут помочь.

@MappedSuperclass:

  • является удобство класса
  • Используется для хранения поведения общего состояния & доступно для дочерних классов
  • Не persistable
  • только дочерних классов persistable

@Inheritance определяет одну из трех стратегий отображения:

  1. однотабличные
  2. Регистрация
  3. Таблица для каждого класса

@DiscriminatorColumn используется для определения того, какие колонки будут использоваться для различения дочерних объектов.

@DiscriminatorValue используется для указания значения, которое используется для различения дочернего объекта.

следующие результаты кода в следующем:

enter image description here

Вы можете видеть, что поле идентификатора в обеих таблицах, но только указанный в AbstractEntityId @MappedSuperclass.

Кроме того, @DisciminatorColumn отображается как PARTY_TYPE в таблице Party.

@DiscriminatorValue отображается как Лицо как запись в столбце PARTY_TYPE таблицы Party.

Очень важно, чтобы класс AbstractEntityId не сохранялся.

Я не указал @Column аннотации и вместо этого просто полагался на значения по умолчанию.

Если вы добавили объект организации, которая простиралась партии, и если это был упорствовал дальше, то таблица Сторона будет иметь:

  • 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. 

    } 

Надеется, что это помогает :)

Смежные вопросы