您在持久实体之间的身份冲突方面遇到了问题。您可以看到,您从第一个查询中得到四条记录,从第二个查询中得到两条与数据库中的记录匹配的记录。但是当entitymanager正在处理第二个集合中的记录时,它看到已经有ID为1和2的持久实体,因此它不会创建新的实体。
创建JPA可嵌入密钥:
@Embeddable
public class MyKey implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "id", nullable = false)
private String id;
@Column(name = "name", nullable = false)
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
MyKey that = (MyKey) o;
return Objects.equals(id, that.getId()) && Objects.equals(name, that.getName());
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
}
然后使用SampleModel实体中的嵌入键:
@Entity
public class SampleModel {
@EmbeddedId
private MyKey myKey;
public MyKey getMyKey() {
return myKey;
}
public void setMyKey(MyKey myKey) {
this.myKey = myKey;
}
}
System.out.println("*****************************************");
System.out.println("Data from findAllFromTable1():");
list1.forEach(l -> {
System.out.println(l.getMyKey().getName());
});
System.out.println("*****************************************");
System.out.println("Data from findAllFromTable2():");
list2.forEach(l -> {
System.out.println(l.getMyKey().getName());
});
System.out.println("*****************************************");
然后试试你的TestController。我试过了,结果是:
*****************************************
Data from findAllFromTable1():
First row from table 1
Second row from table 1
Third row from table 1
Fourth row from table 1
*****************************************
Data from findAllFromTable2():
** TABLE 2: 1st ROW UPPERCASE **
** TABLE 2: 2nd ROW UPPERCASE **
*****************************************