为什么在添加新行时 link / junction table 行的主要 ID 会更改现有行?
Why the primary id of a link / junction table row changes on existing rows when new row is added to it?
我是 运行 WildFly8 上的一个网络项目,我的数据库是 SQL Server 2012。
我创建了一个联结 table service_service_package
以 Service
和 ServicePackage
实体关联 ManyToMany
关系,因为服务可以属于许多服务包和服务包可能有多个与之关联的不同服务。
结点 table 具有以下列:id、service_id 和 service_package_id。这是创建上述联结 table:
的 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);
}
}
...
}
这是 ServicePackage 实体的相关部分:
@Entity
@Table(name = "service_package")
public class ServicePackage {
@ManyToMany(targetEntity=Service.class, mappedBy="servicePackages")
private List<Service> services = new ArrayList<>();
...
}
我对服务有看法。视图的一部分是与服务关联的 ServicePackage 列表。当我将 ServicePackages 添加到列表中并在该视图中按下保存按钮时,该视图会保留该服务,该列表中所有新添加的服务都将与列表中的 ServicePackages 相关联。
这是来自上述视图的相关代码:
for (ServicePackage sp : spList.getTempSpList()) {
service.addServicePackage(sp);
}
service = (Service) service.save();
save 方法保留服务并创建一个到结点的条目 table。
现在,所有这一切都完美地工作,但是每次将新的 ServicePackage 添加到列表中并将服务保存在联结 table 中的现有 links也获得递增的 ID,即使服务 class 中的 addServicePackage 仅添加尚未与服务关联的服务包
例如:我按照上面的方式给一个Service(id 6)添加了一个ServicePackage(id 4),并保存了Service。现在结点 table 得到以下条目,例如:
id service_id service_package_id
-------------------------------------------------
1 6 4
现在,例如,在同一个视图中,我将另一个 ServicePackage(id 11) 添加到列表中,然后像往常一样保存服务。然后 table 看起来像这样:
id service_id service_package_id
-------------------------------------------------
2 6 4
3 6 11
所以,结点table中第一个link的id从1变成了2。虽然方法只添加了ServicePackage( id 11) 添加到与服务关联的 ServicePackages 列表中,因为它识别出第一个已经存在(我已经用 Println 测试过了。)
我的问题是,当 link 未更改时,如何防止结点 table 中前一个 link 的 ID 递增。这意味着一行被删除并添加了一个新行。我希望第一行的 id 保持为 1。有什么想法吗,谢谢?
链接到某个服务的 service_service_package 结点 table 中所有 "link rows" 的所有现有主要 ID 在链接到新的 ServicePackage 时被覆盖和递增的原因 (或从中删除)同一个服务只是实体服务中的集合 servicePackages 是一个列表。
我将该集合更改为 HashSet,问题已解决。原因是与 ArrayList 不同,HashSet 不接受重复项,因此现有链接保持原样,其 id 不变。
我是 运行 WildFly8 上的一个网络项目,我的数据库是 SQL Server 2012。
我创建了一个联结 table service_service_package
以 Service
和 ServicePackage
实体关联 ManyToMany
关系,因为服务可以属于许多服务包和服务包可能有多个与之关联的不同服务。
结点 table 具有以下列:id、service_id 和 service_package_id。这是创建上述联结 table:
的 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);
}
}
...
}
这是 ServicePackage 实体的相关部分:
@Entity
@Table(name = "service_package")
public class ServicePackage {
@ManyToMany(targetEntity=Service.class, mappedBy="servicePackages")
private List<Service> services = new ArrayList<>();
...
}
我对服务有看法。视图的一部分是与服务关联的 ServicePackage 列表。当我将 ServicePackages 添加到列表中并在该视图中按下保存按钮时,该视图会保留该服务,该列表中所有新添加的服务都将与列表中的 ServicePackages 相关联。
这是来自上述视图的相关代码:
for (ServicePackage sp : spList.getTempSpList()) {
service.addServicePackage(sp);
}
service = (Service) service.save();
save 方法保留服务并创建一个到结点的条目 table。
现在,所有这一切都完美地工作,但是每次将新的 ServicePackage 添加到列表中并将服务保存在联结 table 中的现有 links也获得递增的 ID,即使服务 class 中的 addServicePackage 仅添加尚未与服务关联的服务包
例如:我按照上面的方式给一个Service(id 6)添加了一个ServicePackage(id 4),并保存了Service。现在结点 table 得到以下条目,例如:
id service_id service_package_id
-------------------------------------------------
1 6 4
现在,例如,在同一个视图中,我将另一个 ServicePackage(id 11) 添加到列表中,然后像往常一样保存服务。然后 table 看起来像这样:
id service_id service_package_id
-------------------------------------------------
2 6 4
3 6 11
所以,结点table中第一个link的id从1变成了2。虽然方法只添加了ServicePackage( id 11) 添加到与服务关联的 ServicePackages 列表中,因为它识别出第一个已经存在(我已经用 Println 测试过了。)
我的问题是,当 link 未更改时,如何防止结点 table 中前一个 link 的 ID 递增。这意味着一行被删除并添加了一个新行。我希望第一行的 id 保持为 1。有什么想法吗,谢谢?
链接到某个服务的 service_service_package 结点 table 中所有 "link rows" 的所有现有主要 ID 在链接到新的 ServicePackage 时被覆盖和递增的原因 (或从中删除)同一个服务只是实体服务中的集合 servicePackages 是一个列表。
我将该集合更改为 HashSet,问题已解决。原因是与 ArrayList 不同,HashSet 不接受重复项,因此现有链接保持原样,其 id 不变。