EntityManager em = getEntityManager();
em.getTransaction().begin();
Person p = em.find(Person.class, 1);
em.clear();p.setId(2);     //主键策略为AUTO,数据库为MySQL
p.setName("csdn");
em.merge(p);
em.getTransaction().commit();
//.....
JPA中的merge类似Hibernate中的saveOrUpdate方法,当数据库中存在id=2的Person,在em.close()时会发送一条update语句,而当数据库中不存在id=2的Person,在em.close()时会发送一条insert语句。
请问JPA是怎么判断什么时候该发update,什么时候该发insert的?

解决方案 »

  1.   

    merge 一般的作用是合并已经被 EntityManager 脱管的对象合并到数据库中去,如果数据库中不存在则执行类似于 persist 的操作。至于内部是怎么判断的,我认为是主键,JPA 的 Entity 类必须有个主键,如果主键为空时说明不是 update,如果拥有主键时表示是 update
      

  2.   

    to 1#
    你说的和hibernate的主键策略为native类型。
    但是我刚刚的实验产生的行为并不是这样的
    同样是setId(2),结果是不一样的
      

  3.   

    我认为是要看数据库定义的主键生成策略是什么类型的,如果是自动生成的话,就会根据ID去判断;如果是其他类型,有可以是根据整个对象去判断的,因为数据库本身就不会自动生成ID.
      

  4.   

    hibernate中相应的属性设置,JPA中有吗?
      

  5.   

    hibernate中相应的属性设置,JPA中有吗?   ---- hibernate 中的 属性设置 在 JPA中 都有响应的设置  只是hibernate是通过 User.hbm.xml 来配置 自己对象的属性 而jpa是通过 在 User.java对象的属性上或者 setXX()方法上(这两种方式 只可以选择一个)来添加  对应属性的注解 然后让 JPA得配置文件扫描 即可生成 对应的属性和表