Spring中的许多JPA删除以前的记录
大家好,我正在尝试使用HSQLDB、Spring、Webflow和JSF开发petclinic应用程序 其中,BusinessEntities层中的Vet和Specialities实体具有以下多种关系 java 当我添加另一个ID为2的Vet对象时Spring中的许多JPA删除以前的记录,jpa,many-to-many,Jpa,Many To Many,大家好,我正在尝试使用HSQLDB、Spring、Webflow和JSF开发petclinic应用程序 其中,BusinessEntities层中的Vet和Specialities实体具有以下多种关系 java 当我添加另一个ID为2的Vet对象时 -------------- ----------------- -------------------- | Vets | | Specialities | |
-------------- ----------------- --------------------
| Vets | | Specialities | | vet_specialities |
| --------------| |-----------------| |--------------------|
| ID Name | | ID Name | |Spe_ID Vet_ID |
| --------------| |-----------------| |--------------------|
| 2 ABC | | 1 Surgery | | 1 2 |
-------------- | 2 Radiology | | 2 2 |
----------------- --------------------
在这里,我以前的条目被删除,新条目被存储,我的要求是保留旧的兽医条目
我有vetsPage.xhtml,其中有一个带有提交按钮的文本框和相应的vets.xml流,在其条目上创建新的vetsVO对象并使用JPA将其保存在列表中,此时Specialities集为空,同样,我有一个带有相应流的文本框和提交按钮的specialitiesPage,该流也创建了SpecialitiesVO对象并保存在列表中,现在我又有了一个页面,即VetsSpecialities页面,我将从下拉列表中选择一个vetsVO对象,并将其映射到specialities并保存。通过这一点,它可以适当地节约,但会高估现有关系。
尝试了几条建议,即使用mappedBy、CascadeType.MERGE等。。但是没有一个能达到预期的效果。任何帮助都是非常感谢的。SetSpecialies收集了一个集合,似乎用新的集合替换了现有的集合。如果传入的集合中只有一个值,它将替换其中的值,并清除新集合的当前状态。如果是这种情况,则需要添加到现有集合中,而不是替换它。还请注意,您的两个实体必须使用相同的联接表创建独立的M:M映射。您可以尝试使用ManyToMany(mappedby=“specialtieses”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)将一个映射到另一个映射,这样它就是一个真正的双向关系亲爱的Chris谢谢您的帮助。请现在查看查询,因为我已经编辑了该查询,现在该查询应该是大图了。对不起,这一变化并没有增加更多的细节,比如你正在做什么来为兽医添加一个特产。当您向兽医的specialtieses集合添加一个Specialties,然后调用merge时,该集合是否为空?确保两侧都从EM读取,并且不是带有id的空壳,这是一个常见错误。同样如上所述,您没有双向关系。尝试修复关系,因为对一方的更改可能会覆盖另一方当前形式的更改或与另一方的更改发生冲突。完成双向关系建议的更改,并通过递增方式自动生成两个表中的ID,此外,我不能依赖于合并。让我们假设我有一个vetsVO,集合为空,首先合并是可以的,我想将vetsVO集合的内部更改为新集合如何?我的要求是坚持使用setter和getet,即使现在它也不起作用。那么您要用另一个集合替换其中只有一个实体的集合,用一个但不同的实体替换另一个集合?合并将状态合并到托管实体中;它不是特定于单个集合的。合并结束时,托管实体的状态将与您传入的实例相同,因此它将有一个回收单个实体的集合,如数据库中所示。调用getSpecialtieses().add(speciality)而不是替换集合,或者向Vets添加一个方法来为您添加集合
@Entity
@Table(name = "SPECIALTIES", schema = "PUBLIC", catalog = "PUBLIC")
public class Specialties implements BaseEntity, java.io.Serializable {
private Long id;
private String name;
private Set<Vets> vetses = new HashSet<Vets>(0);
public Specialties() {
}
public Specialties(Long id) {
this.id = id;
}
public Specialties(Long id, String name, Set<Vets> vetses) {
this.id = id;
this.name = name;
this.vetses = vetses;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "ID", unique = true, nullable = false)
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "NAME", length = 80)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "VET_SPECIALTIES", schema = "PUBLIC", catalog = "PUBLIC", joinColumns = { @JoinColumn(name = "SPECIALTY_ID", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "VET_ID", nullable = false, updatable = false) })
public Set<Vets> getVetses() {
return this.vetses;
}
public void setVetses(Set<Vets> vetses) {
this.vetses = vetses;
}
}
-------------- ----------------- --------------------
| Vets | | Specialities | | vet_specialities |
| --------------| |-----------------| |--------------------|
| ID Name | | ID Name | |Spe_ID Vet_ID |
| --------------| |-----------------| |--------------------|
| 1 ABC | | 1 Surgery | | 1 1 |
-------------- | 2 Radiology | | 2 1 |
----------------- --------------------
-------------- ----------------- --------------------
| Vets | | Specialities | | vet_specialities |
| --------------| |-----------------| |--------------------|
| ID Name | | ID Name | |Spe_ID Vet_ID |
| --------------| |-----------------| |--------------------|
| 2 ABC | | 1 Surgery | | 1 2 |
-------------- | 2 Radiology | | 2 2 |
----------------- --------------------