JPA EntityManager.persist方法抛异常的原因

当主键生成策略设置为手动设置:new出来的对象设置好 id 才能 persist,否则抛异常

@Test
public void test() {
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
    EntityManager em = factory.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    tx.begin();

    Student s = new Student();
    s.setSname("张飞");
    s.setSage(21);

    em.persist(s); 
    /*

    javax.persistence.PersistenceException: 
    org.hibernate.id.IdentifierGenerationException: 
    ids for this class must be manually assigned before calling save(): cn.wm.domain.Student

     */

    tx.commit();
    em.close();
    factory.close();
}

@Entity
public class Student {
    @Id // 没有添加@GeneratedValue注解,即手动设置主键
    private Long sid;
    private String sname;
    private Integer sage;

    public Long getSid() {
        return sid;
    }

    public void setSid(Long sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public Integer getSage() {
        return sage;
    }

    public void setSage(Integer sage) {
        this.sage = sage;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", sage=" + sage +
                '}';
    }
}

当主键生成策略设置为自动生成:new出来的对象 id 必须为 null 才能 persist ,否则抛异常

@Test
public void test() {
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
    EntityManager em = factory.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    tx.begin();

    Student s = new Student();
    s.setSid(1L);
    s.setSname("曹操");
    s.setSage(26);
    em.persist(s); 
    /*

    javax.persistence.PersistenceException: 
    org.hibernate.PersistentObjectException: 
    detached entity passed to persist: cn.wm.domain.Student

     */

    tx.commit();
    em.close();
    factory.close();
}

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 设置主键生成策略设置为自动生成
    private Long sid;
    private String sname;
    private Integer sage;

    public Long getSid() {
        return sid;
    }

    public void setSid(Long sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public Integer getSage() {
        return sage;
    }

    public void setSage(Integer sage) {
        this.sage = sage;
    }
}
posted @ 2020-07-29 18:11  学习java进行时  阅读(700)  评论(0编辑  收藏  举报