提问者:小点点

为什么多对多联接表不插入


我使用所有默认的表名和列名,所以我没有添加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 (?)

共1个答案

匿名用户

当我们使用双向关联时,我们必须提供“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);