Java 为什么在添加新行时,链接/连接表行的主id在现有行上发生更改?

Java 为什么在添加新行时,链接/连接表行的主id在现有行上发生更改?,java,hibernate,sql-server-2012,many-to-many,junction-table,Java,Hibernate,Sql Server 2012,Many To Many,Junction Table,我在WildFly8上运行一个web项目,我的数据库是SQL Server 2012 我创建了一个连接表service\u service\u package来关联service和ServicePackage关系中的实体,因为服务可以属于多个服务包,并且服务包可能有多个不同的服务与其关联 连接表有以下列:id、service_id和service_package_id。下面是创建所述连接表的SQL脚本: CREATE TABLE service_service_package ( id BI

我在WildFly8上运行一个web项目,我的数据库是SQL Server 2012

我创建了一个连接表
service\u service\u package
来关联
service
ServicePackage
关系中的实体,因为服务可以属于多个服务包,并且服务包可能有多个不同的服务与其关联

连接表有以下列:id、service_id和service_package_id。下面是创建所述连接表的SQL脚本:

CREATE TABLE service_service_package
(
  id BIGINT NOT NULL IDENTITY(1,1),
  service_id BIGINT NOT NULL,
  service_package_id BIGINT NOT NULL,
  PRIMARY KEY (id)
);
以下是服务实体的相关部分:

@Entity
@Table(name = "service")
public class Service {

@ManyToMany(targetEntity=ServicePackage.class, fetch=FetchType.LAZY)
    @JoinTable(name = "service_service_package",
        joinColumns =
        @JoinColumn(name = "service_id"),
        inverseJoinColumns =
        @JoinColumn(name = "service_package_id")
    )
    private List<ServicePackage> servicePackages;

    @Transient
    public void addServicePackage(ServicePackage sp) {
        if (!this.servicePackages.contains(sp)) {
            this.servicePackages.add(sp);
        }    
    }
...
}
save方法保存服务并创建连接表的条目

现在,所有这些在其他方面都可以完美地工作,但每次将新ServicePackage添加到列表中并保存服务时,连接表中的现有链接也会获得一个递增的id,即使服务类中的addServicePackage只添加了尚未与服务关联的ServicePackages

例如:我以上述方式将ServicePackage(ID4)添加到服务(ID6),并保存该服务。现在,连接表将获得以下条目,例如:

id       service_id        service_package_id
-------------------------------------------------
1        6                 4
现在,例如,在同一视图中,我将另一个ServicePackage(ID11)添加到列表中,然后像往常一样保存服务。然后该表如下所示:

id       service_id        service_package_id
-------------------------------------------------
2        6                 4
3        6                 11
因此,连接表中第一个链接的id从1更改为2。即使该方法仅将ServicePackage(id 11)添加到与该服务相关联的ServicePackages列表中,因为它识别出第一个链接已经存在(我已使用Println对此进行了测试)


我的问题是,当连接表中的前一个链接未更改时,如何防止该链接的id增加。这意味着删除一行并添加一个新行。我希望第一行的id保持为1。有什么想法吗,谢谢?

当一个新的ServicePackage链接到(或从)同一个服务时,service\u service\u package连接表中链接到某个服务的所有“链接行”的所有现有主id都被覆盖并增加的原因很简单,实体服务中的集合servicePackages是一个列表。

我将该集合更改为哈希集,问题就解决了。原因是与ArrayList不同,HashSet不接受重复的链接,因此现有链接保持原样,id不变

id       service_id        service_package_id
-------------------------------------------------
1        6                 4
id       service_id        service_package_id
-------------------------------------------------
2        6                 4
3        6                 11