仅限Hibernate JPA 2.0更新并插入子表

时间:2016-09-14 14:44:09

标签: hibernate jpa-2.0

我是Hibernate JPA的新手.....我有一个父表和多个子表。我想根据父表存在的子表中插入记录。我不想在父表中插入任何记录如果在父表中存在条目,那么我想在子表中插入。我尝试在父表主键中使用insertable和updatable作为false。但它不起作用。我正在使用JPA 2.0版本。请提前感谢您。如有任何其他信息,请通知我。

================从评论中复制粘贴:

代码示例:

@Entity
@NamedQuery(name="Custome.findAll", query="SELECT p FROM Customer p") 
public class Customer extends AbstractObject implements Serializable {
  private static final long serialVersionUID = 1L;

  @EmbeddedId
  private CustomerPK pk;

 @Temporal(TemporalType.DATE)
 @Column(name="end_dt") 
 private Date endDt; 

 @Column(name="desc_txt") 
 private String descTxt; 

 //bi-directional many-to-one association to Dependent 
 @OneToMany(mappedBy="customer", cascade=CascadeType.ALL) 
 private List<Dependent> dependents = new ArrayList<>(); 
}

我想更新customer表中的descTxt,并想要插入Dependent表。如果CustomerPK存在于表中,那么我想更新,如果不是我想要跳过Customer表中的记录更新和插入。目前我正在使用session.saveorUpdate(对象)如果存在记录,它正在更新父记录并插入子表中,但如果父记录不存在则会插入父记录和子记录,我不想在父记录中插入记录

1 个答案:

答案 0 :(得分:0)

JPA不会解决这个问题。如果您拨打&#39; saveOrUpdate&#39;,它将保存或更新。如果它表现得像你期望的那样会非常糟糕。

实际上,如果您不打算保存它,则永远不应创建新的Customer对象。您最好在JPA之外实现您的签入代码,例如

Customer customer = entityManager.find(Customer.class, customerPK);
if(customer != null){
  customer.setDescription(...)
  customer.addDependent(new Dependent (...))
  //customer + dependents will be saved at end of transaction or at flush
}
else {
  LOG.info("Ignoring unexisting id", customerPk)
}

注意:

  • 如果客户实例是由Hibernate创建的,并且您执行了正确的事务/会话管理,则无需调用session.saveOrUpdate。 Hibernate将跟踪当前会话中持久对象的所有更改,并在会话结束时刷新它们。
  • 如果您将Dependent添加到客户的依赖列表(最佳做法是使用addXxx方法),它也会在会话结束时自动插入正确的外键。