【发布时间】:2013-12-04 05:23:38
【问题描述】:
在 EclipseLink 中使用 JPA 我有 2 个类:用户和地址。
简化,在同一个事务中,我创建了一个新用户,一个新地址并将该地址添加到用户,因为知道每个用户可以有多个地址:
User = new User();
Address address= new Address();
user.addAddress(address);
这是用户类中的映射:
@OneToMany(mappedBy = "idUser")
private Set<Address> addresses;
这是 Address 类中的映射:
@ManyToOne(cascade = { javax.persistence.CascadeType.REFRESH, javax.persistence.CascadeType.MERGE })
@JoinColumn(name = "id_user", referencedColumnName = "id", nullable = false)
private User user;
我正在使用 Spring Data JPA 自定义存储库,在其中注入 entitymanager 并从服务中调用:
public void saveUser(TUsuario user)
{
em.persist(user);
}
之后,我坚持地址
address.setDay(1);
address.setMonth(2);
address.setYear(3);
address.setUser(user);
public void saveUserAddress(Address address)
{
em.persist(address);
}
最后,当服务方法完成后,事务就完成了。
当我尝试提交操作时,会引发错误:
'A new object was found through a relationship that was not marked cascade PERSIST'
如果我将用户地址列表标记为级联 PERSIST,则 eclipselink 会尝试保存用户两次(我认为一次是在我持久化用户时,第二次是在持久化用户地址时)。
我怎样才能让eclipselink不持久化它,而是将它检测为现有对象?
PS:我尝试使用合并而不是持久化,但没有奏效。
【问题讨论】:
-
抱歉,打错了。不是会话类而是地址类
-
我已经测试了两种方法,但它总是出错:1)只需将地址对象添加到用户地址列表并保存用户对象(包含新地址)。 2)创建地址对象,添加用户对象并保存地址对象。
标签: java spring jpa eclipselink