【发布时间】:2020-04-16 08:12:30
【问题描述】:
我将尝试在我的 SpringBoot 应用程序中创建 @ManyToMany 关系。 我使用 JPARespository,我创建了 2 个模型:
用户
@Entity(name = "User")
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
@ManyToMany//(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
@LazyCollection(value = LazyCollectionOption.FALSE)
@JoinTable(
name = "users_groups",
joinColumns = @JoinColumn(name = "users_id"),
inverseJoinColumns = @JoinColumn(name = "groups_id")
)
private Set<UGroup> groups;
public User() {
this.groups = new HashSet<>();
}
public void addGroup(UGroup uGroup) {
this.groups.add(uGroup);
uGroup.users.add(this);
}
public void removeGroup(UGroup uGroup) {
this.groups.remove(uGroup);
uGroup.users.remove(this);
}
}
UGroups
@Data
@Entity(name = "UGroup")
@Table(name = "groups")
public class UGroup {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
@ManyToMany(mappedBy = "groups", cascade = {CascadeType.MERGE, CascadeType.PERSIST})
@LazyCollection(value = LazyCollectionOption.FALSE)
public Set<User> users;
public UGroup() {
this.users = new HashSet<>();
}
public void addUser(User user) {
this.users.add(user);
user.getGroups().add(this);
}
public void removeUser(User user) {
this.users.remove(user);
user.getGroups().remove(this);
}
}
我通过 DataConfiguration 类加载启动数据:
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
User user = new User();
user.setName("Damian");
userRepository.save(user);
user = new User();
user.setName("Marta");
userRepository.save(user);
user = new User();
user.setName("Natalia");
userRepository.save(user);
UGroup uGroup = new UGroup();
uGroup.setName("Mieszkanie");
uGroup = uGroupRepository.save(uGroup);
user = userRepository.findById(1).get();
user.addGroup(uGroup);
user = userRepository.save(user);
// unable to execute
/*
user = userRepository.findById(2).get();
user.addGroup(uGroup);
user = userRepository.save(user);
*/
// unable to execute 2
/*
uGroup = uGroupRepository.findById(4).get();
uGroup.addUser(userRepository.findById(3).get());
uGroup = uGroupRepository.save(uGroup);
*/
}
当我只为 1 个用户执行插入组时,一切都很好。
虽然当我尝试为 1 和 2 个用户执行插入组或为组插入 3 个用户时,它会导致 java.lang.StackOverflowError: null 异常。
我不知道哪里出错了。谁能帮助我并解释我应该在哪里以及为什么要更改某些内容? 提前致谢。
【问题讨论】:
-
您需要提及连接表和列以使您的 manyTomany 工作
-
如果我知道正确@JoinTable 是没有必要的,但我尝试使用它。仍然无法正常工作,同样的异常。
-
通过堆栈跟踪发布您遇到的错误/异常,以便更容易解释/调试问题。
标签: java hibernate spring-boot spring-data-jpa hibernate-mapping