У меня есть вопрос по отображению 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`)
) ;