Hibernate: How specify custom sequence generator class name using annotations?

Solution 1:

please find below set of code which i have used in project for the same.

@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)
    {
        ...
    }
}

Solution 2:

please refer the custom-id-generator-in-hibernate this may help you. In this example, I am creating the sequence number by taking MAX number from primary key table called pk_table.

Employee Class looks as follows.

@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 class looks as follows

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;
}

}

Here, we have Implemented the interface IdentifierGenerator to override the function generate(SessionImplementor session, Object object). the statement SELECT MAX(value) as value from hibernate_tutorial.pk_table will get the MAX number from the table pk_table. And then we prefix the MAX number with the string "EMP".

Output looks as follows:

EMPLOYEE

------------------------------------------------------------
employee_id | birth_date | cell_phone | firstname | lastname
------------------------------------------------------------
EMP1        | 2014-08-22 | 111        | Nina      |  Mayers