2017-04-05 139 views
0

服务类弹簧数据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; 
    } 

} 
+0

您正在使用哪个JPA提供程序?还向我们展示了'Table1'实体 –

+0

Hibernate,编辑了实体 –

+0

'equals'和'hashCode'的问题,请 –

回答

0

TL; DR - 同一个对象不能两次同一会话持久化。

声明Table1 t2 = t1;实质上使得tableService.saveTable1(t1,10,t2)tableService.saveTable1(t1,10,t1)相同。因此,在同一个会话中使用相同的对象引用时,只有一条记录被保留。

由于通过new关键字创建的两个对象具有不同的引用,因此将相应的两条记录保存在数据库中。

在不同的会议上坚持同一对象两次要么

  • 拯救他们(可能会非常棘手
  • 深克隆原来的对象,并节省,即原来的和克隆在同一个会话(推荐

另外,请注意,建议覆盖equalshashCode作为entiti避免任何意外。