2016-09-14 64 views
1

我是新的Hibernate JPA .....我有一个父表和多个子表。我想根据父表存在的子表中插入记录。不想在父表中插入任何记录。如果条目存在于父表中,那么我想插入到子表中。我尝试在父表主键中插入和更新为false。但它不起作用。我正在使用JPA 2.0版本,请提前感谢您。请让我知道任何其他信息。休眠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<>(); 
} 

我想在客户表更新descTxt和婉插入从属表。如果CustomerPK在表中存在,那么我想更新,如果不是,我想跳过客户表中的记录更新和插入也。目前我正在使用session.saveorUpdate(对象)如果记录存在它正在更新父记录和插入子表中,但如果父记录不存在,那么它插入父记录和子记录,我不想插入父记录

+0

请添加一些代码来显示你正在尝试做什么?父母和子女实体是什么,它们是如何相关的? – greyfairer

+0

代码示例:@Entity @NamedQuery(name =“Custome.findAll”,query =“SELECT p FROM Customer p”) publi} c类Customer扩展AbstractObject implements Serializable {private static final long serialVersionUID = 1L; \t @EmbeddedId \t private CustomerPK pk; \t @Temporal(TemporalType.DATE) \t @Column(name =“end_dt”) \t private Date endDt; \t @Column(name =“desc_txt”) \t private String descTxt; \t //双向多到一个关联到从属 \t @OneToMany(的mappedBy = “客户”,级联= CascadeType.ALL) \t私人列表家属=新的ArrayList <>(); –

+0

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

回答

0

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) 
} 

注:

  • 没有必要打电话session.saveOrUpdate如果客户实例被创建的Hibernate,你做适当的事务/会话MGMT。 Hibernate将跟踪当前会话中对持久对象的所有更改,并在会话结束时对其进行刷新。
  • 如果您将一个Dependent添加到客户的依赖项列表(最佳实践是使用addXxx方法),它将自动在会话结束时使用正确的外键插入。
+0

感谢您的更新..它会尝试让你知道这个选项。 –

+0

感谢您的更新..它会尝试让你知道...我期待的一个更多的澄清是customer.addDependent(...)需要添加到客户?否则我可以在检查Customer实体的存在后使用session.saveorupdate吗? –

+0

请参阅添加注释 – greyfairer