Отображение таблицы на подкласс с данными Spring - PullRequest
0 голосов
/ 02 июня 2018

Я работаю над реализацией стратегии отображения таблиц на подклассы, используя Spring Data Jpa и аннотации, мои сомнения касаются функции автоинкремента.

У меня есть два класса, "Persona" и "Jugador", "Jugador "происходит от" Persona ".

Я не знаю, должен ли автоинкремент Id быть аннотирован для родительского класса, дочернего класса или обоих.

Пример кода:

@Entity
@Table(name="personas")
@Inheritance(strategy=JOINED)
public class Persona implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

@Entity
@Table(name="jugadores")
@PrimaryKeyJoinColumn(name="id")

public class Jugador extends Persona {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

Я сомневаюсь, например, когда я думаю, если я сохраню «Jugador» и автоматически увеличиваю ID, что гарантирует, что один и тот же идентификатор в родительской таблице будет идентичным?и если я сделаю автоинкремент только для родительского класса, как дочерний класс обнаружит это, чтобы присвоить себе тот же идентификатор, что и родительский класс, чтобы их можно было объединить?

Я не понимаю, как этобудет вести себя на заднем плане, пожалуйста, помогите.

1 Ответ

0 голосов
/ 02 июня 2018

Иерархия сущностей должна когда-либо определять свой идентификатор только один раз, поэтому вам не следует делать это как в корневом классе сущности, так и в подклассе, как в вашем случае.

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Persona {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer id;
}

@Entity
public class Jugador extends Persona {
}

Если вы посмотрите на свойТаблицы базы данных, вы заметите, что обе таблицы сущностей для Persona и Jugador содержат столбец для идентификатора.

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

@MappedSuperclass
public abstract class AbstractBaseEntity<T> {
  // define common attribues here

  // define the identifier methods abstract
  // do not place any annotations on these methods here
  public abstract T getId();
  public abstract void setId(T id);
}

@Entity
public class EntityA extends AbstractBaseEntity<Integer> {
  // define EntityA attributes here

  // implement identifier getter/setter with annotations
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  public Integer getId() { return this.id; }
  public void setId(Integer id) { this.id = id; }
}

@Entity
public class EntityB extends AbstractBaseEntity<Long> {
  // define EntityB attributes here

  // implement identifier getter/setter with annotations
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE)
  public Long getId() { return this.id; }
  public void setId(Long id) { this.id = id; }
}

Вы также можете применить @Inheritance здесь, но вы бы сделали это как на EntityA, так и на EntityB по мере необходимости, так как они являются корневыми сущностями для двух разных иерархий сущностей, которые просто совместно используютсяобщий абстрактный интерфейс благодаря AbstractBaseEntity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...