Java 如何使用Hibernate或JPA在不删除映射表中以前的数据的情况下建立多对多关系

Java 如何使用Hibernate或JPA在不删除映射表中以前的数据的情况下建立多对多关系,java,hibernate,jpa,many-to-many,hibernate-mapping,Java,Hibernate,Jpa,Many To Many,Hibernate Mapping,我有两个实体:User.java和PushNotification.java 和名为userpushnotification的映射表,其中进行多对多映射。 userpushnotification表中的现有数据对我来说很重要。 因此,如果我尝试为推送通知(id=2)添加用户(假设id=5,6,7),hibernate将删除关系表中推送通知(id=2)的先前数据,然后为该推送通知(id=2)添加新用户。 我需要保存关系表中的所有记录。 那么,如何限制Hibernate/JPA只执行insert查询

我有两个实体:User.javaPushNotification.java 和名为userpushnotification的映射表,其中进行多对多映射。 userpushnotification表中的现有数据对我来说很重要。 因此,如果我尝试为推送通知(id=2)添加用户(假设id=5,6,7),hibernate将删除关系表中推送通知(id=2)的先前数据,然后为该推送通知(id=2)添加新用户。
我需要保存关系表中的所有记录。 那么,如何限制Hibernate/JPA只执行insert查询,而不是执行delete和insert查询呢。 简单地说,我只想在关系表中追加数据,而不是覆盖

User.java:-

@Entity
@Table(name = "user")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "id")
    @GenericGenerator(name = "gen", strategy = "identity")
    @GeneratedValue(generator = "gen")
    private long id;
    @Column(name = "username")
    private String username;
    @Column(name = "password")
    private String password;
    @Column(name = "authkey")
    private String authKey;

    @ManyToMany(fetch = FetchType.EAGER, mappedBy = "users")
    private Set<PushNotifications> pushNotifications = new HashSet<PushNotifications>();
所以,我希望你明白了,我不希望hibernate进行删除操作。 请帮我解决这个问题,寻找答案。。。 提前感谢。

您可以使用它在JPA之上工作,并为集合的DML操作提供支持。查询可以如下所示

criteriaBuilderFactory.insertCollection(entityManager, PushNotifications.class, "users")
    .fromIdentifiableValues(User.class, "u", newUsers)
    .bind("id", notification.getId())
    .bind("users").select("u")
    .executeUpdate();
如中所述设置Blaze Persistence后,可以创建如下存储库:

@Component
class MyRepository {
  @Autowired CriteriaBuilderFactory cbf;
  @Autowired EntityManager em;

  public void addUsers(Collection<User> newUsers) {
    cbf.insertCollection(em, PushNotifications.class, "users")
    .fromIdentifiableValues(User.class, "u", newUsers)
    .bind("id", notification.getId())
    .bind("users").select("u")
    .executeUpdate();
  }
}
@组件
类MyRepository{
@自连线标准构建器工厂cbf;
@自动连线实体管理器;
公共void addUsers(集合newUsers){
cbf.insertCollection(em,PushNotifications.class,“用户”)
.fromIdentifiableValues(User.class,“u”,新用户)
.bind(“id”,notification.getId())
.bind(“用户”)。选择(“u”)
.executeUpdate();
}
}
这将只向联接表中发出insert。

您可以使用它在JPA之上工作,并为集合的DML操作提供支持。查询可以如下所示

criteriaBuilderFactory.insertCollection(entityManager, PushNotifications.class, "users")
    .fromIdentifiableValues(User.class, "u", newUsers)
    .bind("id", notification.getId())
    .bind("users").select("u")
    .executeUpdate();
如中所述设置Blaze Persistence后,可以创建如下存储库:

@Component
class MyRepository {
  @Autowired CriteriaBuilderFactory cbf;
  @Autowired EntityManager em;

  public void addUsers(Collection<User> newUsers) {
    cbf.insertCollection(em, PushNotifications.class, "users")
    .fromIdentifiableValues(User.class, "u", newUsers)
    .bind("id", notification.getId())
    .bind("users").select("u")
    .executeUpdate();
  }
}
@组件
类MyRepository{
@自连线标准构建器工厂cbf;
@自动连线实体管理器;
公共void addUsers(集合newUsers){
cbf.insertCollection(em,PushNotifications.class,“用户”)
.fromIdentifiableValues(User.class,“u”,新用户)
.bind(“id”,notification.getId())
.bind(“用户”)。选择(“u”)
.executeUpdate();
}
}

这将只向联接表发出insert。

问题在于此行通知。setUsers(newUsers);为什么要创建一个新集合?因为我使用了set users=new HashSet();在PushNotifications实体中声明多对多映射时,因此我必须将用户集作为映射过程的参数传递,对吗?当尝试通过调用notifications.getUsers()获取现有用户时;向这个集合中添加新用户是不可伸缩的,因为如果我只想添加一个用户,我必须毫无理由地获得5000个现有用户,这需要花费大量的时间。谢谢,但这样你就可以删除它,因为你创建了一个新的集合。映射一个包含100多个元素的集合并不是一个好主意。你永远不会需要,问题是这行通知;为什么要创建一个新集合?因为我使用了set users=new HashSet();在PushNotifications实体中声明多对多映射时,因此我必须将用户集作为映射过程的参数传递,对吗?当尝试通过调用notifications.getUsers()获取现有用户时;向这个集合中添加新用户是不可伸缩的,因为如果我只想添加一个用户,我必须毫无理由地获得5000个现有用户,这需要花费大量的时间。谢谢,但这样你就可以删除它,因为你创建了一个新的集合。映射一个包含100多个元素的集合并不是一个好主意。你永远不会需要它
@Component
class MyRepository {
  @Autowired CriteriaBuilderFactory cbf;
  @Autowired EntityManager em;

  public void addUsers(Collection<User> newUsers) {
    cbf.insertCollection(em, PushNotifications.class, "users")
    .fromIdentifiableValues(User.class, "u", newUsers)
    .bind("id", notification.getId())
    .bind("users").select("u")
    .executeUpdate();
  }
}