JPA - создан неверный стол - PullRequest
       2

JPA - создан неверный стол

1 голос
/ 04 августа 2011

С учетом этих лиц:

class SportTeam {
   @Id
   @GeneratedValue
   long id;
   @OneToMany
   private Set<PLayer> players;
   @OneToMany
   private Set<Player> stars;
}
// A sport team can have multiple players and some of those players can be stars.

class Player {
   @Id
   @GeneratedValue
   long id;
   (...)
}

Вот DDL, сгенерированный Hibernate:

CREATE TABLE sportteam
(
  id bigint NOT NULL,
  (...)
  CONSTRAINT sportteam_pkey PRIMARY KEY (id)
)

CREATE TABLE sportteam_player
(
  sportteam_id bigint NOT NULL,
  player_id bigint NOT NULL,
  star_id bigint NOT NULL,
  CONSTRAINT sportteam_player_pkey PRIMARY KEY (sportteam_id, star_id),
  CONSTRAINT fk6cf55c6645d973bc FOREIGN KEY (player_id)
  REFERENCES player (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk6cf55c66ca1af8b8 FOREIGN KEY (star_id)
  REFERENCES player (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT sportteam_player_star_id_key UNIQUE (star_id),
  CONSTRAINT sportteam_player_player_id_key UNIQUE (player_id)
)    


CREATE TABLE player
(
   id bigint NOT NULL,
   (...)
   CONSTRAINT player_pkey PRIMARY KEY (id)
)

Я бы предпочел, чтобы sportteam_player выглядел так:

CREATE TABLE sportteam_player
(
  sportteam_id bigint NOT NULL,
  player_id bigint NOT NULL,
  is_star boolean DEFAULT 'FALSE',
  CONSTRAINT sportteam_player_pkey PRIMARY KEY (sportteam_id, player_id),
  CONSTRAINT fk6cf55c6645d973bc FOREIGN KEY (player_id)
  REFERENCES player (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk6cf55c66ca1af8b8 FOREIGN KEY (sportteam_id)
  REFERENCES sportteam (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION
)    

Как мне это сделать?

1 Ответ

4 голосов
/ 04 августа 2011

Невозможно моделировать такие отношения JPA.Вы предполагаете, что Team-to-Star - это отношение один-ко-многим в смысле реляционной базы данных.Это, безусловно, своего рода стереотипное отношение, но оно основано на свойстве игрока, который является звездой или нет.Итак:

class Player {
  @Id
  @GeneratedValue
  long id;
  @Column(name = “is_star”, columnDefinition="boolean default false")
  boolean star;
  (...)
}

class SportTeam {
  @Id
  @GeneratedValue
  long id;
  @OneToMany
  private Set<PLayer> players;

  public Collection<Player> getStars() {
    // return your stars here, filter through players.
    // if you want you can do caching, but remember to set the field to @Transient
    // so that Hibernate does not think, it could be a relation
  }
}

Зачем мне это делать?В SportTeam вы уже загрузили всех игроков.Нет причин делать это через базу данных.Быть звездой - это свойство звезды, и если вам нужен список в классе SportTeam, это просто другой взгляд на существующих игроков.

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