JPA-entityManager的基本方法

public class JPATest {

    private EntityManager entityManager;
    private EntityTransaction transaction;
    private EntityManagerFactory entityManagerFactory;

    @Before
    public void setUp() throws Exception {
        entityManagerFactory = Persistence.createEntityManagerFactory("jpa-1");
        entityManager = entityManagerFactory.createEntityManager();
        transaction = entityManager.getTransaction();
        transaction.begin();
    }

    @After
    public void destroy() {
        transaction.commit();
        entityManager.close();
        entityManagerFactory.close();
    }
    
    //若传入的是一个游离对象,即传入的对象有OID
    //1.若在entityManager缓存中没有该对象
    //2.若在数据库中有相应的记录
    //3.JPA会查询对应的记录,然后返回该记录的一个对象,再把游离对象的属性复制到查询到的对象中
    //4.对查询到的对象执行update操作
    @Test
    public void testMerge3(){
        Customer customer = new Customer();
        customer.setAge(123);
        customer.setBirthday(new Date());
        customer.setCreattime(new Date());
        customer.setEmail("bdqn@163.com");
        customer.setLastname("bdqn");
        customer.setId(7);
        Customer customer2 = entityManager.merge(customer);
        System.out.println(customer==customer2);
    }
    
    //若传入的是一个游离对象,即传入的对象有OID
    //1.若在entityManager缓存中没有该对象
    //2.若在数据库中也没有相应的记录
    //3.JPA会新建一个对象,然后把游离对象的属性复制给新建对象
    //4.再对新建的对象执行insert操作
    @Test
    public void testMerge2(){
        Customer customer = new Customer();
        customer.setAge(123);
        customer.setBirthday(new Date());
        customer.setCreattime(new Date());
        customer.setEmail("dami@163.com");
        customer.setLastname("dami");
        customer.setId(99);
        Customer customer2 = entityManager.merge(customer);
        System.out.println(customer);//null
        System.out.println(customer2);//3
    }
    
    /**
     * 总的来说相当于hibernate中Session的saveorupdate()
     */
    //若传入的是一个临时对象,会 创建一个新的对象,把临时对象的属性复制到新的对象中,
    //然后对新的对象执行持久化操作,所有新的对象有id,原临时对象没有id
    @Test
    public void testMerge1(){//改
        Customer customer = new Customer();
        customer.setAge(123);
        customer.setBirthday(new Date());
        customer.setCreattime(new Date());
        customer.setEmail("dami@163.com");
        customer.setLastname("dami");
        Customer customer2 = entityManager.merge(customer);
        System.out.println(customer.getId());//null
        System.out.println(customer2.getId());//3
    }
    
    // 类似于hibernate的Seesion的delete方法,把对象对应的记录从数据库中删除
    //注意:只能删除持久化对象,而hibernate的delete方法还可以删除游离状态
    @Test
    public void testRemvoe(){//删
//        Customer customer = new Customer();
//        customer.setId(2);
        Customer customer = entityManager.find(Customer.class, 3);
        entityManager.remove(customer);
        
    }
    

    // 类似于hibernate的Seesion的save方法
    // 使对象由临时变为持久状态,即执行insert语句
    //和hibernate的save方法的区别:若对象有id,则不能执行insert操作,会抛异常
    @Test
    public void testPersist() {//增
        Customer customer = new Customer();
        customer.setAge(12);
        customer.setBirthday(new Date());
        customer.setCreattime(new Date());
        customer.setEmail("qq@163.com");
        customer.setLastname("jiangli");
        //customer.setId(100);
        entityManager.persist(customer);
        System.out.println(customer.getId());
    }
    
    // 类似于hibernate的Seesion的load方法
    //
    @Test
    public void testGetReferenece() {
        Customer customer = entityManager.getReference(Customer.class, 1);
        System.out.println("--------------");
        System.out.println(customer);
    }

    // 类似于hibernate的Seesion的get方法
    // 与getreference()的区别:在调用find()时就已经发送了select语句,
    // 而getreference()属于懒加载,只有在需要时才发送select
    @Test
    public void testFind() {//查
        Customer customer = entityManager.find(Customer.class, 1);
        System.out.println("--------------");
        System.out.println(customer);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值