我有一个JPA Mapping问题要做。
我们在两个实体(Sale和Pig)之间存在一对多的关系。课程的最后一章是关于ilustrate的。
'Sale'是'Pig'上的一个事件,就像系统中的许多其他事件一样('Inspection'是另一个例子)。 然而,'Sale'是唯一一个与'Pig'建立一对多关系的活动,其他活动与One-to-One有关。
因此,为了映射'Pig'的所有事件,我们使用'PigEvent'实体。 我们在用户在系统中插入'Pig'的同时保存(插入)'PigEvent'对象。
我们想要使用这个实体('PigEvent'),就像Sale.getPigs()映射的'jointable'一样。 但这样做会出现一些问题: - 当插入一个新的'Sale'时,hibernate尝试为'Sale'中的每个'Pig'插入新的'PigEvent' (这会产生重复的PK异常,因为PigEvent已经存在) - 当删除一个新的'Sale'时,hibernate会删除'Sale'中每个'Pig'的'PigEvent' (这样做我们松开了其他事件关系数据)
我们知道这是这种映射的正常行为(一对多与jointable)。 我们想知道如何配置JPA / Hibernate来加载Sale.getPigs()(在SELECT中), 但是在'Sale'中的INSERT,UPDATE,DELETE操作中根本没有动作(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`)
) ;
答案 0 :(得分:0)
您不能使用相同的表(e33PigEvent
)来映射实体(PigEvent
)和关联(OneToMany关联)。如果表映射到实体,那么Sale和Pig之间就没有OneToMany关联:在Sale
和PigEvent
之间有一个OneToMany,由{{1中的外键映射} {},以及e33PigEvent
和OneToOne
之间的PigEvent
,也由Pig
中的外键映射。
如果使用JoinTable映射OneToMany,则每次从集合中添加或删除Pigs时,Hibernate都会处理此表本身的插入和删除。由于连接表中有其他列,因此您需要自己创建PigEvent实例,并将这些实例添加到销售事件的集合中。