Java 基于多通关系的JPA和EclipseLink级联持续误差
使用JPA和EclipseLink,我有两个类:User和Address 简化,在同一事务中,我创建了一个新用户,一个新地址,并将该地址添加到用户,因为每个用户可以有多个地址:Java 基于多通关系的JPA和EclipseLink级联持续误差,java,spring,jpa,eclipselink,Java,Spring,Jpa,Eclipselink,使用JPA和EclipseLink,我有两个类:User和Address 简化,在同一事务中,我创建了一个新用户,一个新地址,并将该地址添加到用户,因为每个用户可以有多个地址: User = new User(); Address address= new Address(); user.addAddress(address); 这是用户类中的映射: @OneToMany(mappedBy = "idUser") private Set<Address> addresses; 我
User = new User();
Address address= new Address();
user.addAddress(address);
这是用户类中的映射:
@OneToMany(mappedBy = "idUser")
private Set<Address> addresses;
我使用的是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);
}
最后,当服务方法完成时,进行事务处理
当我尝试提交thansaction时,会出现一个错误:
'A new object was found through a relationship that was not marked cascade PERSIST'
如果我将用户地址列表标记为cascade PERSIST,那么eclipselink会尝试保存用户两次(我认为在保存用户时保存一次,在保存用户地址时保存第二次)
我怎样做才能使它黯然失色,而不是将其持久化,而是将其检测为一个现有对象
PS:我尝试使用合并而不是持久化,但没有成功 一个错误是:
@OneToMany(mappedBy = "user")//you have idUser
然后加上
请尝试以下操作:
User user = new User();
Address address = new Address();
address.setUser(User);
user.addAddress(address);
em.persist(user);//you can delete this, if you add PERSIST (address.user field) to the @ManyToOne(cascade = { javax.persistence.CascadeType.REFRESH, javax.persistence.CascadeType.MERGE })
em.persist(address);
对不起,是打字错误。它不是session类,而是address classI对这两种方法都进行了测试,结果都错了:1)只需将address对象添加到用户地址列表中,然后保存用户对象(包含新地址)。2) 创建地址对象,将其添加到用户对象,然后保存地址对象。它工作正常!问题是,在进行交易之前,我是否需要用户id,但这是另一个主题…谢谢!
User user = new User();
Address address = new Address();
address.setUser(User);
user.addAddress(address);
em.persist(user);//you can delete this, if you add PERSIST (address.user field) to the @ManyToOne(cascade = { javax.persistence.CascadeType.REFRESH, javax.persistence.CascadeType.MERGE })
em.persist(address);