Java 为什么在添加新行时,链接/连接表行的主id在现有行上发生更改?
我在WildFly8上运行一个web项目,我的数据库是SQL Server 2012 我创建了一个连接表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
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