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

@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]
  • 虽然提前设置了,但是将被忽略
posted @ 2018-03-04 22:16  車輪の唄  阅读(89)  评论(0)    收藏  举报  来源