自定義JPA主鍵生成策略實現儲存時允許自定義ID
適合場景
在使用Spring Data JPA的時候,在使用UUID作為主鍵的時候,通常都會使用system-uuid
作為主鍵生成策略,類似配置如下:
@Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "uuid2") private String id;
我們都知道,使用save
方法儲存實體的時候JAP會根據主鍵判斷是新增(主鍵為空或者資料庫表中無該主鍵)還是更新(資料庫表中有該主鍵)。
而且,在使用這種如上配置的時候無論實體的主鍵是否為空,只要在表中不存在,都會再次生成主鍵,也就是沒辦法通過給id
屬性賦值的形式來自定義實體的id。
而在一些場景下,會有自定義主鍵的需求,比如主鍵來源於其他第三方系統,這時候我們期望的還是使用第三方系統的主鍵作為主鍵以表示同一條資料,這就需要我們能夠實現自定義主鍵生成策略,並且JPA也提供了這樣的通道。
自定義主鍵生成策略
Spring Data JPA可以通過實現org.hibernate.id.IdentifierGenerator
介面來自定義主鍵生成器,而同時也提供了許多的內建生成器,就如上文中的system-uuid
生成器,使用uuid2
生成策略實現主鍵生成,也有實現自增的主鍵生成器:IncrementGenerator
。
根據需求,可以通過繼承org.hibernate.id.UUIDGenerator
生成器來實現自定義ID:
/** * 自定義UUID生成器 * @author sevenlin */ public class CustomUUIDGenerator extends UUIDGenerator { @Override public Serializable generate(SessionImplementor session, Object object) throws HibernateException { Object id = FieldUtil.readField(object, "id"); if (id != null) { return (Serializable) id; } return super.generate(session, object); } }
有了自定義主鍵生成器之後就可以通過如下配置指定該生成器:
@Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "custom-uuid") @GenericGenerator(name = "custom-uuid", strategy = "com.sevenlin.dal.CustomUUIDGenerator") private Stringid;
這樣,就可以實現自定義ID,同時保留原來的主鍵生成策略不變。