在我的项目中,我希望有ManyToMany单向映射。为此,我已经为它们创建了用户和配方实体以及存储库(使用Spring JPA存储库)。现在,我想用一些示例条目填充数据库。一旦启动spring-boot应用程序,就会发生错误:
org.hibernate.PersistentObjectException:分离的实体传递给 永久:com.example.demo.database.Recipe
这是我的用户和食谱类:
-用户-
@Data
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
private String email;
@NotNull
@Size(min = 8)
private String password;
@ManyToMany(cascade = CascadeType.ALL)
private Set<Recipe> favouriteRecipes = new HashSet<>();
private User() {}
public User(String email, String password) {
this.email = email;
this.password = password;
}
}
-食谱-
@Data
@Entity
public class Recipe {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
private String title;
private Recipe() {}
public Recipe(String title) {
this.title = title;
}
}
这是我向数据库添加行的方式:
@Component
public class DatabaseInitializer implements CommandLineRunner {
@Autowired
private UserRepository userRepository;
@Override
public void run(String... args) throws Exception {
User u1 = new User("rick.astley@gmail.com", "admin123");
User u2 = new User("john.doe@gmail.com", "admin123");
Recipe r1 = new Recipe("Chicken curry");
Recipe r2 = new Recipe("Spaghetti bolognese");
u1.getFavouriteRecipes().add(r1);
u1.getFavouriteRecipes().add(r2);
u2.getFavouriteRecipes().add(r1);
u2.getFavouriteRecipes().add(r2);
userRepository.save(u1);
userRepository.save(u2);
}
}
我尝试遵循this教程,但是那家伙使用了休眠而不是Spring存储库,所以这就是我被困在这里的原因。我真的不知道我在哪里错。
任何帮助将不胜感激:)
答案 0 :(得分:2)
在保存employeesCollection.Update(Query.EQ("_id", MyObject.Id),
UpdateBuilder.PushWrapped("Holidays", item)
时,Hibernate会尝试再次保存User u2
(因为它在保存Recipes r1 and r2
时已经保存了)。之所以发生这种情况,是因为在用户类中以User u1
出现的@ManyToMany
注释似乎是User
的父对象,而事实并非如此,因为Recipe
在{{1 }}。
解决方案:
Recipies
。&
Users
集合中。以下链接可能会有所帮助:
A beginner’s guide to JPA and Hibernate Cascade Types
How to persist @ManyToMany relation - duplicate entry or detached entity