Hibernate JPA 2.0仅更新和插入子表
我不熟悉Hibernate JPA…..我有一个父表和多个子表。我想根据父表的存在在子表中插入记录。我不想在父表中插入任何记录。如果父表中存在条目,则我想在子表中插入。我尝试将父表主键中的insertable和Updateable设置为false。但它不起作用。我使用的是JPA2.0版本。提前谢谢。请让我知道任何其他信息 ==================从注释粘贴的副本: 代码示例:Hibernate JPA 2.0仅更新和插入子表,hibernate,jpa-2.0,Hibernate,Jpa 2.0,我不熟悉Hibernate JPA…..我有一个父表和多个子表。我想根据父表的存在在子表中插入记录。我不想在父表中插入任何记录。如果父表中存在条目,则我想在子表中插入。我尝试将父表主键中的insertable和Updateable设置为false。但它不起作用。我使用的是JPA2.0版本。提前谢谢。请让我知道任何其他信息 ==================从注释粘贴的副本: 代码示例: @Entity @NamedQuery(name="Custome.findAll", query="SEL
@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<>();
}
@实体
@NamedQuery(name=“Custome.findAll”,query=“从客户p中选择p”)
公共类Customer extends AbstractObject实现可序列化{
私有静态最终长serialVersionUID=1L;
@嵌入ID
私人客户pk;
@时态(TemporalType.DATE)
@列(name=“end_dt”)
私人日期endDt;
@列(name=“desc_txt”)
私有字符串descTxt;
//双向多对一关联到依赖
@OneToMany(mappedBy=“customer”,cascade=CascadeType.ALL)
private List dependents=new ArrayList();
}
我想更新customer表和wan中的descTxt以插入依赖表。若CustomerPK存在于表中,那个么我想更新,若不存在,我想跳过Customer表中记录的更新和插入。当前我正在使用session.saveorUpdate(object)如果记录存在,它将更新父记录并插入子表,但如果父记录不存在,它将插入父记录,而子记录我不想插入父记录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将跟踪当前会话中对持久对象的所有更改,并在会话结束时刷新这些更改
- 如果将从属项添加到客户的从属项列表中(最佳做法是使用addXxx方法),它也将在会话结束时自动插入正确的外键