【问题标题】:org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persistorg.springframework.dao.InvalidDataAccessApiUsageException:分离的实体传递给坚持
【发布时间】:2021-07-18 06:20:09
【问题描述】:

我有两个模型,一个用于存储用户详细信息,使用该 ID,我试图将用户位置保存在另一个表中,该表使用与主键相同的用户 ID。

用户模型

public class User {
   
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(unique = true)
    private String username;
    @Column(unique=true)
    private String email;
    private String password;
    private String Role;
    
    @OneToOne(mappedBy = "user")
    private UserLocation location;
    
     //...constructors, getters and setters
 
}

用户位置模型

@Entity
public class UserLocation {
   
    @Id
    private Long id;

    @OneToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name="id")
    @MapsId
    private User user;
    
    private Point location;
    //...constructors, getters and setters
}

我的 Spring Boot 应用程序类,我尝试将记录插入到两个表中

@SpringBootApplication
public class ContainmentZoneAlertApp implements CommandLineRunner {
    @Autowired
    private UserlocationRepository userLocRepo;
    @Autowired
    private UserRepository userRepo;
    public static void main(String[] args) {
        SpringApplication.run(ContainmentZoneAlertApp.class, args);
                
    }
    @Override
    public void run(String... args) throws Exception {
        
        UserLocation userLocation = new UserLocation();
        Geometry geometry = GeometryUtil.wktToGeometry(String.format("POINT (13.0827 80.2707)"));
        //GeometryUtil is a utility class 

        User user = new User(null,"user 3","user3@gmail.com","hello123","user");
        user = userRepo.save(user);
        userLocation.setUser(user);
        userLocation.setLocation((Point)geometry);
        userLocRepo.save(userLocation);
    }

}

我得到

caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.saravanan.models.User

为什么会出现此错误?坚持是什么意思? & 我正在使用 MySQL 数据库

【问题讨论】:

标签: java spring-boot hibernate spring-data-jpa spatial


【解决方案1】:

您必须确保两个保存操作都在同一个事务中,否则第一个实体将被分离,这会导致此异常。

所以只需将@Transactional 添加到run 方法中:

@Transactional
@Override
public void run(String... args) throws Exception {

【讨论】:

  • 谢谢,先生。但是我想先保存用户,然后再保存用户位置,这意味着我不会同时保存它们。会不会有问题?我不能那样做吗? “实体分离”实际上是什么意思,为什么它是一个问题?再次感谢
  • 当然可以。确保读取和保存在同一个事务中。在此处阅读有关 JPA 状态的更多信息vladmihalcea.com/jpa-hibernate-first-level-cache
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2011-09-16
  • 2015-04-22
  • 2021-06-30
  • 1970-01-01
相关资源
最近更新 更多