弹簧数据JPA没有插入的
问题描述:
服务类弹簧数据JPA没有插入的
@Service
public class TableService {
@Autowired
private Table1Repo t1Repo;
public void saveTable1(Table1 t,int a, Table1 t2){
t1Repo.save(t);
int x = 10/a;
t1Repo.save(t2);
}
}
现在,在当我传球表1的两个不同的对象控制器(两者使用新创建的),两排插入DB。
但是如果感到两种方式 一个) 在控制器
Table1 t1 = new Table1()
... setters
Table1 t2 = t1
tableService.saveTable1(t1,10,t2)
B) 表1 T1 =新表1() tableService.saveTable1(t1,10,T1)
传递相同的对象这两种方法都只是在数据库中创建1行?这是为什么?
表1实体
@Entity
@Table(name="table1")
public class Table1 implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private int id;
private String name;
public Table1() {
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
答
TL; DR - 同一个对象不能两次同一会话持久化。
声明Table1 t2 = t1;
实质上使得tableService.saveTable1(t1,10,t2)
与tableService.saveTable1(t1,10,t1)
相同。因此,在同一个会话中使用相同的对象引用时,只有一条记录被保留。
由于通过new
关键字创建的两个对象具有不同的引用,因此将相应的两条记录保存在数据库中。
在不同的会议上坚持同一对象两次要么
- 拯救他们(可能会非常棘手)
- 深克隆原来的对象,并节省,即原来的和克隆在同一个会话(推荐 )
另外,请注意,建议覆盖equals
和hashCode
作为entiti避免任何意外。
您正在使用哪个JPA提供程序?还向我们展示了'Table1'实体 –
Hibernate,编辑了实体 –
'equals'和'hashCode'的问题,请 –