Java 如果列表已经存在,如何向表中插入列表而不重复它们(使用Spring和Hibernate)

Java 如果列表已经存在,如何向表中插入列表而不重复它们(使用Spring和Hibernate),java,mysql,spring,list,hibernate,Java,Mysql,Spring,List,Hibernate,首先,我想指出我对Spring和Hibernate还不熟悉 我一直在尝试使用Spring数据将Hibernate与MySQL连接起来,我已经成功地完成了,但是,当我尝试执行插入时,我无法让它执行我想要的操作 我试图实现的是一个用户类,带有一个ArrayList,其中包含他们喜欢的编码语言。 例如: 用户1:C、java、C++ 用户2:Python java,C++ 然而,我注意到Hibernate将在Languages表中创建一个新行,即使它已经存在。我还希望将id保留为主键和数值 以下是它当

首先,我想指出我对Spring和Hibernate还不熟悉

我一直在尝试使用Spring数据将Hibernate与MySQL连接起来,我已经成功地完成了,但是,当我尝试执行插入时,我无法让它执行我想要的操作

我试图实现的是一个用户类,带有一个ArrayList,其中包含他们喜欢的编码语言。 例如:

用户1:C、java、C++ 用户2:Python java,C++ 然而,我注意到Hibernate将在Languages表中创建一个新行,即使它已经存在。我还希望将id保留为主键和数值

以下是它当前将语言插入表的方式:

+----+--------+
| id | name   |
+----+--------+
|  2 | C      |
|  3 | Java   |
|  4 | C++    |
|  6 | Python |
|  7 | Java   |
|  8 | C++    |
+----+--------+
这就是我想要的:

+----+--------+
| id | name   |
+----+--------+
|  2 | C      |
|  3 | Java   |
|  4 | C++    |
|  6 | Python |
+----+--------+
我尝试过不同的方法,但它总是重复这些值

这是我的用户类:

@Entity
public class User {
    @Id
    @GeneratedValue
    private int id;
    private String username;
    @OneToMany(cascade = CascadeType.ALL)
    private List<Language> languages;

    ...
}
这就是我向每个用户添加语言的方式。这只是一个测试,而不是最终代码:

ArrayList<Language> languages = new ArrayList<>();
languages.add(new Language("C"));
languages.add(new Language("Java"));
languages.add(new Language("C++"));
Image image = null;
User admin = new User("iscle", "albertiscle9@gmail.com", "Test_Password", languages, image);
userRepository.save(admin);

ArrayList<Language> languages2 = new ArrayList<>();
languages2.add(new Language("Python"));
languages2.add(new Language("Java"));
languages2.add(new Language("C++"));
Image image2 = null;
User admin2 = new User("iscle", "albertiscle9@gmail.com", "Test_Password", languages2, image2);
userRepository.save(admin2);

使属性名语言具有唯一性;然后确保没有重复的内容

这还不够!这只会导致插入时出现异常。据我所知,这不是一对多关系,而是多对多关系。您应该相应地进行更改…在您的服务中,在实际更新之前,请检查哪些语言已经存在,并用实际的DB版本替换现有的语言。谢谢您的回答!也许问题在于我如何创建语言实例。我编辑了这篇文章以反映我是如何做的。通常,在手动处理数据库时,我会将所有可能的语言插入到语言表中,然后执行查询以查找其ID,但我认为每次都可以创建一个新实例,然后让Hibernate处理它。我想我错了?最好的方法是先创建条目,然后选择一个鸦片制剂ID吗?再次感谢:
ArrayList<Language> languages = new ArrayList<>();
languages.add(new Language("C"));
languages.add(new Language("Java"));
languages.add(new Language("C++"));
Image image = null;
User admin = new User("iscle", "albertiscle9@gmail.com", "Test_Password", languages, image);
userRepository.save(admin);

ArrayList<Language> languages2 = new ArrayList<>();
languages2.add(new Language("Python"));
languages2.add(new Language("Java"));
languages2.add(new Language("C++"));
Image image2 = null;
User admin2 = new User("iscle", "albertiscle9@gmail.com", "Test_Password", languages2, image2);
userRepository.save(admin2);