J'ai une question de cartographie JPA à faire.Problème avec JPA Mappage un-à-plusieurs avec jointable
Nous avons une relation un-à-plusieurs entre deux entités (Sale et Pig). Les classes suivent à la fin de ce message pour illustrer. «Vente» est un événement sur un «Cochon», comme beaucoup d'autres dans le système («Inspection» est un autre exemple). Cependant, 'Sale' est le seul événement qui a une relation un-à-plusieurs avec 'Pig', les autres ont un One-to-One. Ainsi, pour cartographier tous les événements d'un 'Pig', nous utilisons une entité 'PigEvent'. Nous sauvegardons (insérons) un objet 'PigEvent' en même temps que l'utilisateur insère un 'Pig' dans le système.
Nous voulons utiliser cette entité ('PigEvent') comme le 'jointable' du mappage Sale.getPigs(). Cependant, un problème survient: - lorsqu'une nouvelle 'Vente' est insérée, hibernate essaie d'insérer un nouveau 'PigEvent' pour chaque 'Pig' dans la 'Vente' (cela génère une exception PK dupliquée, car PigEvent déjà existe) - lorsqu'une nouvelle « vente » est supprimée, mise en veille prolongée supprime de la PigEvent 'pour chaque « Pig » dans la « vente » (ce faisant, nous perdons les autres Évènements de la relation)
nous comprenons que c'est le comportement normal de ce type de mapping (One-to-Many avec jointable). Nous voulons savoir comment configurer JPA/Hibernate pour charger simplement Sale.getPigs() (dans SELECT), mais dans les opérations INSERT, UPDATE, DELETE dans 'Sale' n'agissez pas du tout dans ce mapping (Sale. les cochons()).
Nous utilisons Hibernate 3.6.2.
Merci d'avance.
@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",[email protected](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`)
) ;
Donc, est la table e33PigEvent pour mapper l'entité PigEvent, et pour mapper l'association ManyToMany? Pourquoi nous parlez-vous d'une association OneToMany, et la cartographie en utilisant ManyToMany? –
Salut JB, Il était faux sur l'exemple de code ... est @OneToMany. Merci – Rodrigo
Vous n'avez pas répondu à la première question. À quelles tables sont toutes ces entités mappées? –