使用jointable进行JPA Mapping One-to-Many的问题

时间:2011-09-16 13:54:23

标签: java hibernate jpa

我有一个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`)
) ;

1 个答案:

答案 0 :(得分:0)

您不能使用相同的表(e33PigEvent)来映射实体(PigEvent)和关联(OneToMany关联)。如果表映射到实体,那么Sale和Pig之间就没有OneToMany关联:在SalePigEvent之间有一个OneToMany,由{{1中的外键映射} {},以及e33PigEventOneToOne之间的PigEvent,也由Pig中的外键映射。

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

相关问题