我使用所有默认的表名和列名,所以我没有添加jointable(实际上我尝试了jointable)。双向的,两个实体中只有一个有mappedBy。
@Entity
public class User extends AbstractPersistable<Long> {
@ManyToMany
private Set<House> houses;
@Entity
public class House extends AbstractPersistable<Long> {
@ManyToMany(mappedBy = "houses")
Set<User> users;
应该足够简单,除了hibernate在运行test之后没有插入jointable:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoSmApplicationTests {
@Test
public void contextLoads() throws IOException {
House p =new House();
Set us = new HashSet<>();
User u = userRepository.findOne(1L);
us.add(u);
p.setUsers(us);
houseRepository.save(p);
}
控制台只有一个“插入”:
Hibernate: select user0_.id as id1_5_0_, user0_.name as name2_5_0_ from user user0_ where user0_.id=?
Hibernate: insert into house (random) values (?)
当我们使用双向关联时,我们必须提供“helper”方法来保持双方之间的同步,例如:
public House addUsers(User... users) {
Stream.of(users).forEach(user -> {
user.getHouses().add(this);
this.users.add(user);
});
return this;
}
此外,我们必须将< code>@ManyToMany批注的< code>cascade属性至少设置为< code>MERGE,以告诉Hibernate在更新“parent”实体时也更新嵌套对象:
@ManyToMany(mappedBy = "houses", cascade = CascadeType.MERGE)
private final Set<User> users = new HashSet<>();
然后我们可以得到正确的结果:
List<User> users = userRepo.save(Arrays.asList(
new User("user1"),
new User("user2"),
new User("user3")
));
List<House> houses = houseRepo.save(Arrays.asList(
new House("address1"),
new House("address2")
));
houses.get(0).addUsers(users.get(0), users.get(1));
houses.get(1).addUsers(users.get(1), users.get(2));
houseRepo.save(houses);