【发布时间】:2016-10-25 14:21:24
【问题描述】:
JPA 有问题。
我的保存方法被标记为@Transactional,如下所示:
@Transactional(propagation = Propagation.REQUIRED)
public void push(long id) {
Parent parent = dao.findParentById(id);
setParentMeta(parent);
Country country = dao.findCountry(id);
setParentChild(parent);
User user = dao.findUser(id);
dao.update(parent);
}
public void setParentMeta(Parent parent){
parent.setTitle("toto");
parent.setdescription("some description");
}
public void setParentChild(Parent parent){
List<Child> childList = new ArrayList<>();
for (String date : dao.getList()) {
Child child = new Child();
ChildPK childPK = new ChildPK();
childPK.setProductId(parent.getId());
childPK.setDate(date);
child.setChildPK(childPK);
child.setParent(parent);
childList.add(child);
}
parent.setChildList(childList);
}
我的父实体:
public class Parent {
...
private long parentId;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.LAZY, orphanRemoval = true)
private List<Child> childList;
...
}
我的孩子实体:
public class Child {
...
@EmbeddedId
protected ChildPK childPK;
@MapsId("parentId")
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id", referencedColumnName = "parent_id", insertable = true, updatable = true)
private Parent parent;
...
}
@Embeddable
public class ChildPK {
....
@Basic(optional = false)
@Column(name = "parent_id")
private long parentId;
@Basic(optional = false)
@Column(name = "date")
@Temporal(TemporalType.TIMESTAMP)
private Date date;
....
}
我的问题是当我从方法“push”中删除 @Transactional(propagation = Propagation.REQUIRED) 并将其放入 dao 中时,所有插入/更新或回滚都可以正常工作:
@Transactional(propagation = Propagation.REQUIRED)
public E update(E entity) {
return entityManager.merge(entity);
}
但是如果我把这个注释放在 push 方法中并从 dao 中删除它,我会得到这个异常:
Duplicate entry '3623238-2016-02-21 00:00:00' for key 'PRIMARY'
Error Code: 1062
Call: INSERT INTO child (date, parent_id) VALUES (?, ?)
bind => [2016-02-21 00:00:00.0, 3623238]
这里的问题是 eclipselink 在子更改时自动刷新。 有一个为什么要在 push 方法结束时刷新?
【问题讨论】:
标签: spring jpa one-to-many transactional