【问题标题】:Cascade persist error with JPA and EclipseLink on ManyToOne relationship多对一关系上 JPA​​ 和 EclipseLink 的级联持续错误
【发布时间】: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


【解决方案1】:

一个错误是:

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

【讨论】:

  • 有效!问题知道在进行交易之前我是否需要用户 ID,但这是另一个话题......谢谢!
猜你喜欢
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多