persist 方法
- 持久化:保存并使得实体保持Managed状态
- 发送insert语句的时机:
- 如果配置主键生成策略为自动生成,则立即发送 insert 语句到数据库,因为应用程序可能需要这个自动生成的 id
- 如果配置主键生成策略为手动设置,则 commit 时发送 insert 语句到数据库
persist 方法测试
persist 立即发送 insert 语句
@Test
public void test1() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
EntityManager em = factory.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Student s = new Student();
s.setSname("马良");
s.setSage(28);
em.persist(s); // 保存并使得实体保持Managed状态
/*
Hibernate:
insert
into
Student
(sage, sname)
values
(?, ?)
*/
s.setSage(124); // ORM思想:操作Managed状态的实体类对象就相当于操作表中的记录
tx.commit();
/*
Hibernate:
update
Student
set
sage=?,
sname=?
where
sid=?
*/
em.close();
factory.close();
}
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自动生成 id
private Long sid;
private String sname;
private Integer sage;
public Long getSid() {
return sid;
}
public void setSid(Long sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Integer getSage() {
return sage;
}
public void setSage(Integer sage) {
this.sage = sage;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", sage=" + sage +
'}';
}
}
persist 延迟发送 insert 语句
@Test
public void test2() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
EntityManager em = factory.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Student s = new Student();
s.setSid(1L);
s.setSname("刘备");
s.setSage(23);
em.persist(s); // 保存并使得实体保持Managed状态
s.setSage(124); // ORM思想:操作Managed状态的实体类对象就相当于操作表中的记录
tx.commit();
/*
Hibernate:
insert
into
Student
(sage, sname, sid)
values
(?, ?, ?)
Hibernate:
update
Student
set
sage=?,
sname=?
where
sid=?
*/
em.close();
factory.close();
}
@Entity
public class Student {
@Id
private Long sid; // 没有配置 @GeneratedValue,即手动设置 id
private String sname;
private Integer sage;
public Long getSid() {
return sid;
}
public void setSid(Long sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Integer getSage() {
return sage;
}
public void setSage(Integer sage) {
this.sage = sage;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", sage=" + sage +
'}';
}
}