Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于多通关系的JPA和EclipseLink级联持续误差_Java_Spring_Jpa_Eclipselink - Fatal编程技术网

Java 基于多通关系的JPA和EclipseLink级联持续误差

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; 我

使用JPA和EclipseLink,我有两个类:User和Address

简化,在同一事务中,我创建了一个新用户,一个新地址,并将该地址添加到用户,因为每个用户可以有多个地址:

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