2017-04-05 138 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避免任何意外。