AdSense

網頁

2018/6/13

Hibernate JPA 主鍵欄位自動遞增的實體類別設定

如果資料表的主鍵欄位(primary key column)是設定為自動遞增(auto increment),則在Java應用程式中對映的實體類別設定如下。

假設有個員工資料表EMPLOYEE,其ID欄位為主鍵欄位且自動遞增,則對映的實體類別Employee的JPA設定如下。

@GeneratedValue的生成策略要設為GenerationType.IDENTITY(SQL Server, MySQL)。

如果是Oracle資料庫要設為GenerationType.SEQUENCE

Employee.java


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="EMPLOYEE")
public class Employee {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ID")
    private Integer Id;
    
    @Column(name="NAME")
    private String name;
    
    @Column(name="EMAIL")
    private String email;
    
    // getter and setter ...

}

下面是Hibernate的設定方式,把@GeneratedValuegenerator指向@GenericGeneratorstrategy設為increment


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name="EMPLOYEE")
public class Employee {
    
    @Id
    @GeneratedValue(generator="idGenerator") // 參照下面@GenericGenerator的name
    @GenericGenerator(name="idGenerator", strategy = "native")
    @Column(name="ID")
    private Integer Id;
    
    @Column(name="NAME")
    private String name;
    
    @Column(name="EMAIL")
    private String email;
    
    // getter and setter ...

}

在程式中要INSERT一筆資料,則auto increment欄位的成員變數值設為null即可。

EntityManager em = getEntityManager();
EntityTransaction tx = em.getTransaction();
try {
    tx.begin();
    em.persist(entity);
    tx.commit();
} catch (Exception e) {
    e.printStackTrace();
    tx.rollback();
} finally {
    em.close();
}

若不為null則會出現下面錯誤,這是因為Hibernate以為該實體已存在。

Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: idv.matt.entity.Employee


如果本篇有幫助到您,幫忙點一下廣告支持,感恩。

參考:

沒有留言:

AdSense