@Test
@org.springframework.transaction.annotation.Transactional
public void testHibernate(){
Session session=sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
User u1=(User) session.get(User.class, 1);
User u2=new User();
u2.setId(1);
session.saveOrUpdate(u2);
System.out.println(u1==u2);
transaction.commit();
session.close();
}
Hibernate不允许缓存中存在两个持久化对象对应同一个主键。
而JPA中不抛异常:
@Test
@Transactional
public void testJpa(){
User u1=entityManager.find(User.class, 1);
User u2=new User();
u2.setId(1);
u2.setUserName("Jack");
User u3=entityManager.merge(u2);
System.out.println(Arrays.asList(u1));
System.out.println(Arrays.asList(u2));
System.out.println(u1==u2);
System.out.println(u1==u3);
}
这是由于JPA不是在缓存中加载了第二个同一主键的实体对象,而是进行了实体对象的拷贝。
再看S.merge():
@Test
@org.springframework.transaction.annotation.Transactional
public void testHibernateMerge(){
Session session=sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
User u1=(User) session.get(User.class, 1);
User u2=new User();
u2.setId(1);
User u3=(User) session.merge(u2);
System.out.println(u1==u2);
System.out.println(u1==u3);
transaction.commit();
session.close();
}