如何在 JPA 中生成自定义 ID

Posted

技术标签:

【中文标题】如何在 JPA 中生成自定义 ID【英文标题】:How to generate Custom Id in JPA 【发布时间】:2018-04-25 19:45:53 【问题描述】:

我想在 JPA 中生成自定义 ID,它必须是表的主键。 有很多使用休眠创建自定义 ID 的示例,例如 this 我想要相同的实现,但在 JPA 中。ID 必须是字母数字,如 STAND0001

谢谢。

【问题讨论】:

没有spring JPA这样的东西。有 JPA、规范和 JPA 的一些实现,如 Hibernate 或 EclipseLink。 Spring 没有,也不是 JPA 实现。因此,请检查您的 实际 JPA 实现的文档。 JB Nizet 谢谢你的回复..我会编辑问题..你能告诉我如何在 JPA 中生成自定义 id id必须是字符串和数字的组合 我正在使用依赖 spring-boot-starter-data-jpa 版本 1.4.7.RELEASE 并在休眠中实现 这本身就依赖于hibernate。所以你正在使用休眠。所以查看hibernate的文档。 【参考方案1】:

你可以像这样使用GenericGenerator

 @Entity
public class Client 

    @Id
    @GenericGenerator(name = "client_id", strategy = "com.eframe.model.generator.ClientIdGenerator")
    @GeneratedValue(generator = "client_id")  
    @Column(name="client_id")
    private String clientId;

还有自定义的生成器类(会给ID加上前缀,你可以让它做你喜欢的):

public class ClientIdGenerator implements IdentifierGenerator 

@Override
public Serializable generate(SessionImplementor session, Object object)
        throws HibernateException 

    String prefix = "cli";
    Connection connection = session.connection();

    try 
        Statement statement=connection.createStatement();

        ResultSet rs=statement.executeQuery("select count(client_id) as Id from Client");

        if(rs.next())
        
            int id=rs.getInt(1)+101;
            String generatedId = prefix + new Integer(id).toString();
            return generatedId;
        
     catch (SQLException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

    return null;


【讨论】:

GenericGenerator 来自 hibernate 包,问题是如何独立于 JPA 提供者来做到这一点 @Marx 我认为您必须在 EclipseLink 中使用 SessionCustomizer。 JSR 338 中没有提及上述行为。

以上是关于如何在 JPA 中生成自定义 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在php中生成自定义图像?

从安全沙箱(例如小程序)中生成自定义类

在 Form.cs 中生成自定义 C# 代码,同时在设计时在 Form1.cs 中删除用户控件

如何使用jpa项目eclipse在实体类中生成唯一约束

jpa中生成的表中的错误排序

如何将图像拉伸成自定义形状(swift3)