使用Spring JPA进行单向ManyToMany映射

时间:2018-08-01 09:37:32

标签: java hibernate spring-boot jpa many-to-many

在我的项目中,我希望有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存储库,所以这就是我被困在这里的原因。我真的不知道我在哪里错。

任何帮助将不胜感激:)

1 个答案:

答案 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 }}。

解决方案:

  1. 从注释中删除Recipies

  1. 首先保存食谱,然后将其添加到Users集合中。

以下链接可能会有所帮助:

A beginner’s guide to JPA and Hibernate Cascade Types

How to persist @ManyToMany relation - duplicate entry or detached entity