Java JPA使用jointable将一个映射到多个的问题

Java JPA使用jointable将一个映射到多个的问题,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个JPA映射问题要做 我们有一个一对多的关系,两个实体之间的销售和猪。类跟随在本消息的结尾处进行说明 “销售”是“猪”上的事件,与系统中的许多其他事件一样,“检查”是另一个例子。 然而,“销售”是唯一与“猪”有一对多关系的活动,其他活动则是一对一 因此,为了映射“Pig”的所有事件,我们使用“PigEvent”实体。 在用户在系统中插入“Pig”的同时,我们保存并插入一个“PigEvent”对象 我们希望像Sale.getPigs映射的“jointable”一样使用该实体“PigEvent

我有一个JPA映射问题要做

我们有一个一对多的关系,两个实体之间的销售和猪。类跟随在本消息的结尾处进行说明

“销售”是“猪”上的事件,与系统中的许多其他事件一样,“检查”是另一个例子。 然而,“销售”是唯一与“猪”有一对多关系的活动,其他活动则是一对一

因此,为了映射“Pig”的所有事件,我们使用“PigEvent”实体。 在用户在系统中插入“Pig”的同时,我们保存并插入一个“PigEvent”对象

我们希望像Sale.getPigs映射的“jointable”一样使用该实体“PigEvent”。 但这样做会出现一些问题: -插入新的“销售”时,hibernate尝试为“销售”中的每个“猪”插入新的“PigEvent” 这将生成重复的PK异常,因为PigEvent已存在 -删除新的“销售”时,hibernate会为“销售”中的每个“Pig”删除“PigEvent” 这样我们就失去了其他事件关系数据

我们知道,这是这种使用jointable的一对多映射的正常行为。 我们想知道如何配置JPA/Hibernate,以便只在SELECT中加载Sale.getPigs, 但在“Sale”中的INSERT、UPDATE、DELETE操作在映射Sale.pigs中根本不起作用

我们使用Hibernate3.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`)
) ;

不能使用同一个表E33PIGENT将实体PigEvent和关联映射到OneToMany关联。如果该表映射到实体,则Sale和Pig之间不再有OneToMany关联:Sale和PigEvent之间有OneToMany,由e33PigEvent中的外键映射;PigEvent和Pig之间有OneToOne,也由e33PigEvent中的外键映射


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

因此,e33PigEvent表是否用于映射PigEvent实体和映射多个关联?为什么你要告诉我们一个“一对多”的关联,并用“多对多”来映射它?嗨,JB,代码示例中的这一点是错误的。。。是“一家公司”。谢谢你没有回答第一个问题。所有这些实体映射到哪些表?Pig->e33Pig | PigEvent->e33PigEvent | Sale->e33Sale | Inspection->E33Inspection我编辑了问题并添加了表的结构。谢谢您的回复。与Sale和PigEvent直接相关的问题是其他事件,即加载PigEvent的额外连接所导致的开销。所以,我们可以按照你的建议去做,或者离开Sales.pigs@Transient,对吧?是的。它应该是@Transient,并且应该通过迭代所有pig事件并将每个pig添加到返回集来返回动态构造的一组pig。但这只是普通的Java代码:与Hibernate无关。