首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate:如何使用注释指定自定义序列生成器类名?

Hibernate:如何使用注释指定自定义序列生成器类名?
EN

Stack Overflow用户
提问于 2012-07-24 21:22:22
回答 2查看 44.3K关注 0票数 10

我想使用注释指定以下hbm配置:

代码语言:javascript
复制
<id name="somePK" column="&quot;somePK&quot;" type="long">
            <generator class="com.db.hibernate.KeyGenerator"/>
        </id>

我不确定如何为类名提供

代码语言:javascript
复制
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")

我必须在每个实体类中指定@javax.persistence.SequenceGenerator吗?

我可以在@GeneratedValue注解下只指定类名吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-24 21:39:35

请找到下面的代码集,我已经在项目中使用了相同的代码。

代码语言:javascript
复制
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XyzIdGenerator")
@GenericGenerator(name = "XyzIdGenerator",
        strategy = "com.mycompany.myapp.id.BigIntegerSequenceGenerator",
        parameters = {
            @Parameter(name = "sequence", value = "xyz_id_sequence")
        })
public BigInteger getId()
{
   return id;
}


package com.mycompany.myapp.id;

import org.hibernate.id.SequenceGenerator;
...

public class BigIntegerSequenceGenerator
    extends SequenceGenerator
{
    @Override
    public Serializable generate(SessionImplementor session, Object obj)
    {
        ...
    }
}
票数 20
EN

Stack Overflow用户

发布于 2014-08-22 11:01:20

请参考custom-id-generator-in-hibernate,这可能会对您有所帮助。在本例中,我通过从名为pk_table的主键表中获取最大编号来创建序列号。

Employee类如下所示。

代码语言:javascript
复制
@Entity
@Table(name="EMPLOYEE")
public class Employee {

@Id
@GenericGenerator(name = "sequence_emp_id", strategy = "com.supportmycode.model.EmployeeIdGenerator")
@GeneratedValue(generator = "sequence_emp_id")  
@Column(name="employee_id")
private String employeeId;

@Column(name="firstname")
private String firstname;

@Column(name="lastname")
private String lastname;

@Column(name="birth_date")
private Date birthDate;

@Column(name="cell_phone")
private String cellphone;

//Getter and Setter methods.
}

EmployeeIdGenerator类如下所示

代码语言:javascript
复制
public class EmployeeIdGenerator implements IdentifierGenerator {

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

    String prefix = "EMP";
    Connection connection = session.connection();
    try {

        PreparedStatement ps = connection
                .prepareStatement("SELECT MAX(value) as value from hibernate_tutorial.pk_table");

        ResultSet rs = ps.executeQuery();
        if (rs.next()) {
            int id = rs.getInt("value");
            String code = prefix + new Integer(id).toString();
            System.out.println("Generated Stock Code: " + code);
            return code;
        }

    } catch (SQLException e) {       
        e.printStackTrace();
    }
    return null;
}

}

在这里,我们实现了覆盖函数generate(SessionImplementor session, Object object)的接口IdentifierGenerator。语句SELECT MAX(value) as value from hibernate_tutorial.pk_table将从表pk_table中获取最大数字。然后我们在最大号前面加上字符串"EMP“。

输出如下所示:

员工

代码语言:javascript
复制
------------------------------------------------------------
employee_id | birth_date | cell_phone | firstname | lastname
------------------------------------------------------------
EMP1        | 2014-08-22 | 111        | Nina      |  Mayers
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11631800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档