JPA EntityManager persist 方法详解(不允许提前设置id)

本文对比了Java持久化API (JPA) 和 Hibernate 框架中persist与save方法的区别,特别是在主键自动生成场景下两者的不同行为,并通过具体示例展示了如何使用这两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Test
    public void testPersistence(){
        EntityManagerFactory factory;
        EntityManager manager;
        EntityTransaction transaction;
        factory = Persistence.createEntityManagerFactory("JPA");
        manager = factory.createEntityManager();
        transaction = manager.getTransaction();
        transaction.begin();

        Customer customer = new Customer();
        customer.setAge(15);
        customer.setName("张三");
        manager.persist(customer);

        transaction.commit();
        manager.close();
        factory.close();
    }

SQL:

Hibernate: 
    insert 
    into
        CUSTOMERS
        (Age, Email, Name) 
    values
        (?, ?, ?)

persist方法类似于Hibernate save方法,但是存在一个不同点: 
在数据库主键自增情况下:若提前设置id属性值,JPA EntityManager 的 persist方法将抛出异常,而Hibernate Session的 save 方法可以执行,将忽略提前设置的id值

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id;
    @Column(name = "Name")
    private String name;
    @Column(name = "Email")
    private String email;
    @Column(name = "Age")
    private int age;
}

persist:

  @Test
    public void testPersistence(){
        EntityManagerFactory factory;
        EntityManager manager;
        EntityTransaction transaction;
        factory = Persistence.createEntityManagerFactory("JPA");
        manager = factory.createEntityManager();
        transaction = manager.getTransaction();
        transaction.begin();

        Customer customer = new Customer();
        customer.setId(3);
        customer.setAge(15);
        customer.setName("张三");
        manager.persist(customer);

        transaction.commit();
        manager.close();
        factory.close();
    }
  • 抛出org.hibernate.PersistentObjectException

hibernate save:

    @Test
    public void test(){
        //1.创建一个SessionFactory对象
        SessionFactory factory = null;
        //1) 创建Configuration对象
        Configuration cfg = new Configuration().configure();
        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                    .applySettings(cfg.getProperties()).build();
        factory = cfg.buildSessionFactory(serviceRegistry);

        //2.创建一个Session对象
        Session session = factory.openSession();

        //3.开启事务
        Transaction transaction = session.beginTransaction();

        //4.执行保存操作
        User user = new User("张三", "杭州", new Date());
        user.setId(10);
        System.out.println(user);
        session.save(user);
        System.out.println(user);
        //5.提交事务
        transaction.commit();

        //6.关闭Session
        session.close();

    }

User [id=10, name=张三, address=杭州, createOn=Fri Jan 29 11:33:15 CST 2016]
Hibernate: 
    insert 
    into
        users
        (name, Address, createOn, description) 
    values
        (?, ?, ?, ?)
User [id=8, name=张三, address=杭州, createOn=Fri Jan 29 11:33:15 CST 2016]
  • 虽然提前设置了,但是将被忽略
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值