Проблема с отображением JPA один-ко-многим с jointable - PullRequest
1 голос
/ 16 сентября 2011

У меня есть вопрос по отображению JPA.

У нас есть отношения «один ко многим» между двумя объектами (Sale и Pig).Классы следуют в конце этого сообщения, чтобы проиллюстрировать.

«Продажа» - это событие на «Свинье», как и многие другие в системе (другой пример - «Инспекция»).Тем не менее, «Продажа» является единственным событием, которое имеет отношение «один ко многим» со «Свинья», остальные имеют отношение «один к одному».

Таким образом, для отображения всех событий «Свинья» мы используемобъект PigEvent.Мы сохраняем (вставляем) объект 'PigEvent' в то же время, когда пользователь вставляет 'Pig' в систему.

Мы хотим использовать эту сущность ('PigEvent') как 'jointable' в Sale.getPigs () отображение.Но при этом возникает некоторая проблема: - при вставке нового «Sale» hibernate пытается вставить новое «PigEvent» для каждого «Pig» в «Sale» (это генерирует дублирующую исключительную ситуацию PK, поскольку PigEvent уже существует) -при удалении новой «продажи» hibernate удаляет «PigEvent» для каждого «свиньи» в «продаже» (при этом мы теряем данные о других событиях)

Мы понимаем, что это нормальное поведениеэтот вид отображения (один-ко-многим с присоединяемой таблицей).Мы хотим знать, как сконфигурировать JPA / Hibernate, чтобы просто загрузить Sale.getPigs () (в SELECT), но в операциях INSERT, UPDATE, DELETE в 'Sale' действие вообще не выполняется в этом отображении (Sale.pigs ()).

Мы используем Hibernate 3.6.2.

Заранее спасибо.

@Entity
public class Pig extends Persistente implements Serializable {}

@Entity
public class PigEvent extends Persistente {
@OneToOne
@JoinColumn(name="idpig")
private Pig pig;

@OneToOne
@JoinColumn(name="idapproval")
private Inspection approval

@OneToOne
@JoinColumn(name="idsale")
private Sale sale;
}


@Entity
public class Inspection extends Persistente{
      @OneToOne
      @JoinColumn(name="idSuino")
      private Pig pig;
}


@Entity
public class Sale extends Persistente{
@MOneToMany
@JoinTable(name="e33PigEvent",uniqueConstraints=@UniqueConstraint(columnNames="idpig"),
      joinColumns={@JoinColumn(name="idsale",insertable=false,updatable=false)},
      inverseJoinColumns={@JoinColumn(name="idpig",insertable=false,updatable=false)})
public Set<Pig> getPigs() {}
}

Table Structure:
CREATE TABLE  `e33Pig` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
)


CREATE TABLE  `e33PigEvent` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `idPig` int(11) NOT NULL,
  `idInspection` int(11) DEFAULT NULL,
  `idSale` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idPig` (`idPig`),
  CONSTRAINT `fk_e33eventossuino_e33aprovacao1` FOREIGN KEY (`idInspection`) REFERENCES `e33Inspection` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `fk_e33eventossuino_e33suino1` FOREIGN KEY (`idPig`) REFERENCES `e33Pig` (`id`),
  CONSTRAINT `fk_e33eventossuino_e33venda1` FOREIGN KEY (`idSale`) REFERENCES `e33Sale` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
);

CREATE TABLE  `e33Sale` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
);

CREATE TABLE  e33Inspection (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `idsuino` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `fk_e33Inspection_e33suino1` FOREIGN KEY (`idPig`) REFERENCES `e33Pig` (`id`)
) ;

1 Ответ

0 голосов
/ 16 сентября 2011

Нельзя использовать одну и ту же таблицу (e33PigEvent) для сопоставления сущности (PigEvent) и ассоциации (ассоциации OneToMany).Если таблица сопоставлена ​​с сущностью, то у вас больше нет связи OneToMany между Sale и Pig: у вас есть OneToMany между Sale и PigEvent, сопоставленная внешним ключом в e33PigEvent, и OneToOne между PigEvent и Pig, также сопоставляется внешним ключом в e33PigEvent.

Если вы сопоставляете OneToMany с помощью JoinTable, то Hibernate обрабатывает вставки и удаления в этой таблице каждый разВы добавляете или удаляете свиней из коллекции.Поскольку у вас есть дополнительные столбцы в объединяемой таблице, вам нужно создать экземпляры PigEvent самостоятельно и добавить эти экземпляры в коллекцию событий продажи.

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