我有一个 JPA 映射问题要做。
两个实体(Sale 和 Pig)之间存在一对多关系。类(class)在本消息的最后进行说明。
“销售”是“ pig ”上的一个事件,就像系统中的许多其他事件一样(“检查”是另一个例子)。 但是,“Sale”是唯一与“Pig”具有一对多关系的事件,其他事件都是一对一关系。
因此,为了映射“Pig”的所有事件,我们使用“PigEvent”实体。 我们在用户在系统中插入“Pig”的同时保存(插入)“PigEvent”对象。
我们希望像 Sale.getPigs() 映射的“jointable”一样使用此实体(“PigEvent”)。 但这样做,会出现一些问题: - 当插入新的“销售”时, hibernate 尝试为“销售”中的每个“ pig ”插入新的“PigEvent” (这会生成重复的 PK 异常,因为 PigEvent 已经存在) - 当删除新的“销售”时,hibernate 会删除“销售”中每个“ pig ”的“PigEvent” (这样做我们会丢失其他事件关系数据)
我们知道这是这种映射的正常行为(一对多与可连接)。 我们想知道如何配置 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`)
) ;
最佳答案
您不能使用同一个表 ( e33PigEvent
) 来映射实体 ( PigEvent
) 和关联(OneToMany 关联)。如果表映射到实体,则 Sale 和 Pig 之间不再有 OneToMany 关联:Sale
之间有 OneToMany 关联。和PigEvent
,由 e33PigEvent
中的外键映射,以及 OneToOne
之间PigEvent
和Pig
,也由 e33PigEvent
中的外键映射.
如果您使用 JoinTable 映射 OneToMany,则每次您从集合中添加或删除 Pig 时,Hibernate 都会在该表本身中处理插入和删除操作。由于连接表中有其他列,因此您需要自己创建 PigEvent 实例,并将这些实例添加到销售事件集合中。
关于java - JPA 与可连接的一对多映射问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7445768/