Могу ли я создать свою собственную последовательность в Hibernate? - PullRequest
4 голосов
/ 06 сентября 2010

Могу ли я создать свою собственную последовательность в Hibernate , как если бы у меня была последовательность базы данных, и мне нужно добавить 2 символа перед последовательностью?

Ответы [ 2 ]

3 голосов
/ 06 сентября 2010

Вы можете создать свой собственный генератор идентификаторов.Взгляните на это сообщение в блоге , которое в основном показывает, как сделать что-то похожее на то, что вы ищете (если я не правильно понял вопрос):

Custom Hibernate Sequence Generatorдля поля Id

у меня есть таблица с первичным ключом в формате M001, M002 и т. д. (давайте пока не будем думать о том, что происходит после M999).Я использую аннотации Hibernate, и я нашел отличный способ генерации значения первичного ключа для новых записей:

Сначала я создал последовательность базы данных для использования.Затем я реализовал org.hibernate.id.IdentifierGenerator;

public class StockCodeGenerator implements IdentifierGenerator {

    private static Logger log = Logger.getLogger(StockCodeGenerator.class);

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

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

            PreparedStatement ps = connection
                    .prepareStatement("SELECT nextval ('seq_stock_code') as nextval");

            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                int id = rs.getInt("nextval");
                String code = prefix + StringUtils.leftPad("" + id,3, '0');
                log.debug("Generated Stock Code: " + code);
                return code;
            }

        } catch (SQLException e) {
            log.error(e);
            throw new HibernateException(
                    "Unable to generate Stock Code Sequence");
        }
        return null;
    }
}

Затем в своем классе сущности я просто аннотировал поле id следующим образом:

@Id
@GenericGenerator(name="seq_id", strategy="my.package.StockCodeGenerator")
@GeneratedValue(generator="seq_id")
@Column(name = "stock_code", unique = true, nullable = false, length = 20)
public String getStockCode() {
    return this.stockCode;
}
0 голосов
/ 08 декабря 2017

Попробуйте это. С датой и календарем

 public class StockCodeGenerator
 implements IdentifierGenerator
 {
 private static Logger log = Logger.getLogger(StockCodeGenerator.class);


 public StockCodeGenerator() {}

 public int generateCustId()
 {
 Random random = new Random();
 return random.nextInt(100);
 }


 public Serializable generate(SessionImplementor session, Object object)
 throws HibernateException
 {
 String prefix = "Custom_String";
 Connection connection = session.connection();
 System.out.println(session.connection());


 Date date = new Date();

 Calendar calendar = Calendar.getInstance();
 return prefix + "_" + generateCustId() + "_" + calendar.get(1);
 }
 }

А затем используйте его в аннотации @GenericGenerator

@Id
@GenericGenerator(name="seq_id",strategy="com.mvc.StockCodeGenerator.
StockCodeGenerator")
@GeneratedValue(generator="seq_id")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...