jpa 删除是否成功_删除ManyToOne记录后发生Spring Data JPA JpaObjectRetrievalFailureException...

我遇到一个问题,当我删除在ManyToOne关系的许多方面的记录时,它可以工作,但是在下一个数据库事务中,出现异常,提示找不到刚刚删除的实体(例如,尝试添加另一个链接时)说找不到我刚刚删除的那个).我在数据库中验证了记录已被删除.

我在Hibernate中使用Spring MVC和Spring Data JPA.我有一个用户类和一个NewsLink类.一个用户可以有许多新闻链接,而我想删除这些新闻链接之一.我只是通过构建一个简单的应用程序来学习如何独自使用Spring框架.所以这对我来说很新.感谢您的帮助!

用户实体类

@Entity

@Table(name = "users")

public class User implements Serializable{

@Id

@Column(name = "idusers")

@GeneratedValue(strategy = GenerationType.AUTO)

private Long id;

....

@OneToMany(mappedBy="user", fetch= FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval= true)

private Set newsLink;

NewsLink实体类别

@Entity

@Table(name = "news_links")

public class NewsLink implements Serializable{

@Id

@Column

@GeneratedValue(strategy = GenerationType.AUTO)

private Long id;

@Column(insertable=false, updatable=false)

private Long idusers;

....

@ManyToOne

@JoinColumn(name="idusers")

private User user;

这是服务类中正在执行删除的方法.我认为这是我做不到的部分:

@Override

@Transactional

public User deleteNewsLink(int id, User user){

Iterator links = user.getNewsLink().iterator();

while(links.hasNext()){

NewsLink link = links.next();

if (link.getId() == id){

links.remove();

}

}

userRepository.save(user);

return user;

}

这是我所看到的异常:

Request processing failed; nested exception is org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find com.test.dailyemail.repository.NewsLink with id 8; nested exception is javax.persistence.EntityNotFoundException: Unable to find com.test.dailyemail.repository.NewsLink with id 8

javax.persistence.EntityNotFoundException: Unable to find com.test.dailyemail.repository.NewsLink with id 8

at org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:155)

at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:210)

at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:260)

at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148)

at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1078)

at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1005)

at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:651)

at org.hibernate.type.EntityType.resolve(EntityType.java:471)

at org.hibernate.type.EntityType.replace(EntityType.java:328)

at org.hibernate.type.CollectionType.preserveSnapshot(CollectionType.java:581)

at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:534)

at org.hibernate.type.CollectionType.replace(CollectionType.java:664)

at org.hibernate.type.TypeHelper.replace(TypeHelper.java:177)

at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:372)

at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:309)

at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:151)

at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76)

at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:903)

at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:887)

at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:891)

at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:879)

解决方法:

我不确定这是否是您的问题,因为我看不到其余的代码,但我认为如果您仍然想返回User实例,则应使用userRepository.save(user)代替原始的user对象返回在删除NewsLink之后使用该对象.

在save方法的javadoc中说:

Saves a given entity. Use the returned instance for further operations

as the save operation might have changed the entity instance

completely.

试试这样的事情:

@Override

@Transactional

public User deleteNewsLink(int id, User user){

Iterator links = user.getNewsLink().iterator();

while(links.hasNext()){

NewsLink link = links.next();

if (link.getId() == id){

links.remove();

break;

}

}

return userRepository.save(user);

}

标签:spring-data-jpa,hibernate,spring,spring-mvc

来源: https://codeday.me/bug/20191031/1975680.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值