代码之家  ›  专栏  ›  技术社区  ›  J.Kennsy

使用Spring-JPA的单向多人映射

  •  1
  • J.Kennsy  · 技术社区  · 6 年前

    在我的项目中,我希望有许多单向映射。为此,我创建了用户和配方实体以及它们的存储库(使用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 教程,但在那里,他使用hibernate而不是Spring存储库,所以这就是我被困在这里的原因。我真的不知道我错在哪里。

    任何帮助都将不胜感激:)

    1 回复  |  直到 6 年前
        1
  •  2
  •   Pallav Jha    6 年前

    当你存钱的时候 User u2 然后Hibernate试图保存 Recipes r1 and r2 再次(因为它在保存时已经保存了它 User u1 ). 这是因为 @ManyToMany 用户类中的批注显示为 User 似乎是 Recipe 但事实并非如此 Recipies 可能是 Users .

    解决方案:

    1. 移除 cascade 来自注释。

    &

    1. 先保存菜谱,然后将它们添加到 favoriteRecipe 收藏。

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

    A beginner’s guide to JPA and Hibernate Cascade Types

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