首页 > 其他 > 详细

JPA EntiityManager.merge方法

时间:2020-07-30 19:26:39      阅读:95      评论:0      收藏:0      [点我收藏+]

merge 方法

  • 插入 或 更新
  • merge 方法不会改变传入的实体的状态
  • merge 方法会返回一个 Managed 状态的实体,可以进行 remove,setter 等操作

merge 方法测试

merge 方法插入无 id 实体

前提:配置实体的主键生成策略为自动生成,否则会抛出异常

@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(19);

    em.merge(s);
    /*
    Hibernate:
        insert
        into
            Student
            (sage, sname)
        values
            (?, ?)

     */

    tx.commit();
    em.close();
    factory.close();
}

merge 方法插入有 id 实体

前提:数据库对应的表中没有此 id 的记录(立即发出 SQL 语句查询底层数据库),否则就是 更新

@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(400L); // 数据库中没有 id 为 4 的记录
    s.setSname("曹操");
    s.setSage(28);

    em.merge(s);
    /*

    Hibernate:
        select
            student0_.sid as sid1_0_0_,
            student0_.sage as sage2_0_0_,
            student0_.sname as sname3_0_0_
        from
            Student student0_
        where
            student0_.sid=?
    Hibernate:
        insert
        into
            Student
            (sage, sname)
        values
            (?, ?)

     最终存入(16,28,曹操)

     */

    tx.commit();
    em.close();
    factory.close();
}

merge 方法更新有 id 实体

前提:数据库对应的表中有对应 id 的记录(立即发出 SQL 语句查询底层数据库),否则就是 插入

@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(4L); // 数据库中有 id 为 4 的记录
    s.setSname("赵云");
    s.setSage(18);

    em.merge(s);
    /*

    Hibernate:
        select
            student0_.sid as sid1_0_0_,
            student0_.sage as sage2_0_0_,
            student0_.sname as sname3_0_0_
        from
            Student student0_
        where
            student0_.sid=?

     */

    tx.commit();
    /*

    Hibernate:
        update
            Student
        set
            sage=?,
            sname=?
        where
            sid=?
    存入 (赵云,18)

     */
    em.close();
    factory.close();
}

JPA EntiityManager.merge方法

原文:https://www.cnblogs.com/wumingoo1/p/13402792.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!