org.springframework.dao.invaliddataaccessapiusageexception:传递给persist的分离实体

f87krz0w  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(404)

我有两个模型,一个用于存储用户详细信息,并且使用该id,我尝试将用户位置保存在另一个表中,该表使用相同的用户id作为主键。
用户模型

  1. public class User {
  2. @Id
  3. @GeneratedValue(strategy = GenerationType.AUTO)
  4. private Long id;
  5. @Column(unique = true)
  6. private String username;
  7. @Column(unique=true)
  8. private String email;
  9. private String password;
  10. private String Role;
  11. @OneToOne(mappedBy = "user")
  12. private UserLocation location;
  13. //...constructors, getters and setters
  14. }

用户位置模型

  1. @Entity
  2. public class UserLocation {
  3. @Id
  4. private Long id;
  5. @OneToOne(cascade = CascadeType.MERGE)
  6. @JoinColumn(name="id")
  7. @MapsId
  8. private User user;
  9. private Point location;
  10. //...constructors, getters and setters
  11. }

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

  1. @SpringBootApplication
  2. public class ContainmentZoneAlertApp implements CommandLineRunner {
  3. @Autowired
  4. private UserlocationRepository userLocRepo;
  5. @Autowired
  6. private UserRepository userRepo;
  7. public static void main(String[] args) {
  8. SpringApplication.run(ContainmentZoneAlertApp.class, args);
  9. }
  10. @Override
  11. public void run(String... args) throws Exception {
  12. UserLocation userLocation = new UserLocation();
  13. Geometry geometry = GeometryUtil.wktToGeometry(String.format("POINT (13.0827 80.2707)"));
  14. //GeometryUtil is a utility class
  15. User user = new User(null,"user 3","user3@gmail.com","hello123","user");
  16. user = userRepo.save(user);
  17. userLocation.setUser(user);
  18. userLocation.setLocation((Point)geometry);
  19. userLocRepo.save(userLocation);
  20. }
  21. }

我得到

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

为什么我会犯这个错误?坚持到底意味着什么我用的是mysql数据库

o2g1uqev

o2g1uqev1#

必须确保两个保存操作都在同一事务中,否则会分离第一个实体,从而导致此异常。
所以只要加上 @Transactional 运行方法:

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

相关问题