java - JPA 与可连接的一对多映射问题

标签 java hibernate jpa

我有一个 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之间PigEventPig ,也由 e33PigEvent 中的外键映射.

如果您使用 JoinTable 映射 OneToMany,则每次您从集合中添加或删除 Pig 时,Hibernate 都会在该表本身中处理插入和删除操作。由于连接表中有其他列,因此您需要自己创建 PigEvent 实例,并将这些实例添加到销售事件集合中。

关于java - JPA 与可连接的一对多映射问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7445768/

相关文章:

hibernate - 为什么 JPA 不为延迟加载的关系提供 loadChildren() 方法?

java - JBoss EAP 6.3 CMT 多个持久性单元

java - 如何在终端 (Mac) 上运行 Java 程序?

java - FindBugs 说我需要 "use a prepared statement"?如何?

java - Spring Dao和Dao patter在异常处理上的冲突

java - hibernate/jpa如何存储一个实体之间的关系

java - hibernate 查询在堆转储中的作用

java - 如何查找java中给定代码段的控制结构中的条件数量

java - 如何使进度条前进

java - 无法懒惰地初始化角色集合,..无法初始化代理 - 无 session - JPA + SPRING