[英]Jpa ManyToMany relationships doesn't work
我有SpringBoot 2.1.3 + MySql 5.7数据库。 我正在尝试在两个实体之间建立ManyToMany关系:
@Entity
@Data
public class User {
private String name;
@ManyToMany(cascade = CascadeType.ALL)
private List<Hobby> hobbies;
}
@Entity
@Data
public class Hobby {
private String description;
@ManyToMany(mappedBy = "hobbies")
private List<User> users;
}
现在,如果我做了一个测试:
User user = new User();
user.setName("James");
user.setHobbies(new ArrayList<>());
Hobby hobby = new Hobby();
hobby.setDescription("Golf");
hobby.setUsers(new ArrayList<>());
user.getHobbies.add(hobby);
hobby.getUsers.add(user);
userRepository.save(user);
所有三个表都是持久的(用户表,Hobby表和jpa创建的映射表)如下:
USER USER_HOBBY HOBBY
id, name iduser, idhobby id, description
1 James 1 1 1 Golf
但如果现在我打电话
List<User> us = userRepository.findAll();
我们内心我没有任何爱好实体..它说:
com.sun.jdi.InvocationException occurred invoking method.
我的db.config的application.properties:
# Connection url for the database "test"
spring.datasource.url = jdbc:mysql://localhost:3306/test?useSSL=false
# ===============================
# = JPA / HIBERNATE
# ===============================
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
我已经尝试了谷歌找到的所有示例后的所有内容。 怎么了??
谢谢
我想你在调用userRepository.findAll()
之前不要保存爱好实体。
如果在实体之间创建关系,则需要在保存和搜索全局实体之前保存所有实体依赖项。
如果在依赖项字段中保存实体whith NULL,则它们不会抛出异常。 在你的情况下你保存空列表,但休眠不能保存,因为他检查FK并没有找到这个爱好。
您可以尝试使用NULL保存用户或在数据库爱好中存在。 像这样:
List<Hobby> hobbies = hobbyRepository.findAll();
user.getHobbies().addAll(hobbies); // null pointer exception
userRepository.save(user);
userRepository.findAll();
我不明白为什么你的存储库允许你保存。 我在JpaRepository上使用postgres和interface extends,如果我用空的爱好列表保存用户,它们会抛出异常。
我尝试过:
Hobby h = new Hobby();
h.setDesc("Golf");
hobbyRepository.save(h);
List<Hobby> hobbies = hobbyRepository.findAll();
Persona p = new Persona();
p.setNome("Giacomo");
p.setHobbies(new ArrayList<>());
p.getHobbies().addAll(hobbies);
personaRepository.save(p);
List<Persona> persone = personaRepository.findAll();
List<Hobby> hobby = hobbyRepository.findAll();
不起作用..你能做一个类似这个的工作实例吗? 我会很感激,因为我无法理解错误在哪里.PS如果我把:
@ManyToMany(fetch = FetchType.EAGER)
它有效..但我不想把它! 它应该使用默认值..
解决了。 这是一个Session问题,有不同的解决方案。
第一个是添加fetch注释:
@Entity
@Data
public class User {
private String name;
@ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
private List<Hobby> hobbies;
}
这样,每当您找到用户实体时,您将获取所有相关的爱好。 其他解决方案(更好)是保留默认提取值(对于多对多关系是懒惰的)并在用于检索数据的方法上添加@Transactional注释。
@Transactional
public void searchData() {
User user = new User();
user.setName("James");
user.setHobbies(new ArrayList<>());
Hobby hobby = new Hobby();
hobby.setDescription("Golf");
hobby.setUsers(new ArrayList<>());
user.getHobbies.add(hobby);
hobby.getUsers.add(user);
userRepository.save(user);
List<User> us = userRepository.findAll();
for (User u : us) {
System.out.println(u.getHobbies().size()); // print 1
}
}
希望有帮助..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.