Spring数据JPA没有插入

时间:2017-04-05 08:34:41

标签: spring-boot spring-data-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);
    }
}

现在在控制器中,当我传递Table1的两个不同对象(都是使用new创建)时,这两行将插入到DB中。

但是如果我通过两种方式传递同一个对象 一个)  在控制器

 Table1 t1 = new Table1()
 ... setters
 Table1 t2 = t1

 tableService.saveTable1(t1,10,t2)

b)中  表1 t1 =新表1()  tableService.saveTable1(t1,10,T1)

这两种方法只是在DB中创建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;
    }

}

1 个答案:

答案 0 :(得分:0)

TL; DR - 在同一会话中,同一对象不能持续两次。

语句Table1 t2 = t1;基本上使tableService.saveTable1(t1,10,t2)tableService.saveTable1(t1,10,t1)相同。因此,只有一条记录被保留,因为在同一会话中使用相同的对象引用。

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

两次持续存在同一个对象

  • 将它们保存在不同的会话中(可能很棘手
  • 深度克隆原始对象并在同一会话中保存原始对象和克隆(推荐

另请注意,建议您覆盖实体的equalshashCode以避免任何意外。