【问题标题】:Hibernate JPA 2.0 update only and insert in child tablesHibernate JPA 2.0 仅更新并插入子表
【发布时间】:2016-09-14 14:44:09
【问题描述】:

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

================ 从 cmets 复制粘贴:

代码示例:

@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<>(); 
}

我想更新客户表中的 descTxt 并希望插入从属表。如果 CustomerPK 存在于表中,那么我想更新,否则我想跳过更新 Customer 表中的记录并插入。目前我正在使用 session.saveorUpdate(object) 如果记录存在,它正在更新父记录并插入到子表中,但是如果父记录不存在,那么它正在插入父记录和我不想在父记录中插入的子记录记录

【问题讨论】:

  • 请添加一些代码来显示您要执行的操作?什么是父实体和子实体,它们之间的关系如何?
  • 代码示例:@Entity @NamedQuery(name="Custome.findAll", query="SELECT p FROM Customer p") publi } c class Customer extends AbstractObject implements Serializable { private static final long serialVersionUID = 1升; @EmbeddedId 私人客户PK pk; @Temporal(TemporalType.DATE) @Column(name="end_dt") 私人日期 endDt; @Column(name="desc_txt") 私有字符串 descTxt; //与Dependent的双向多对一关联 @OneToMany(mappedBy="customer", cascade=CascadeType.ALL) private Listdependents = new ArrayList();
  • 我想更新客户表中的 descTxt 并希望插入从属表。如果 CustomerPK 存在于表中,那么我想更新,否则我想跳过更新 Customer 表中的记录并插入。目前我正在使用 session.saveorUpdate(object) 如果记录存在,它正在更新父记录并插入到子表中,但是如果父记录不存在,那么它正在插入父记录和我不想在父记录中插入的子记录记录

标签: hibernate jpa-2.0


【解决方案1】:

JPA 不会解决这个问题。如果您调用“saveOrUpdate”,它将保存或更新。如果它在哪里表现得像你期望的那样,那就太糟糕了。

实际上,如果您不打算保存新的 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 方法),它也会在会话结束时自动插入正确的外键。

【讨论】:

  • 感谢您的更新。它会尝试让您知道此选项。
  • 感谢您的更新..它会尝试让您知道...我正在寻找的另一个澄清是 customer.addDependent(...) 需要添加到 Customer 中?或者我可以在检查客户实体的存在后使用 session.saveorupdate 吗?
  • 查看添加的注释
猜你喜欢
  • 2011-07-03
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 2017-10-27
  • 2022-06-22
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多