Реализация последовательности в Java с использованием Hibernate - PullRequest
0 голосов
/ 26 октября 2010

Я использую Java и Hibernate в качестве инструмента ORM. Есть ли способ реализовать последовательность в Java, используя Hibernate?

В настоящее время я использую последовательности Oracle для достижения этой цели, но это очень дорогостоящий способ по мере увеличения взаимодействия с базой данных.

Ответы [ 3 ]

1 голос
/ 26 октября 2010

Это на самом деле очень легко сделать:

package mypackage;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.HibernateException;

import java.io.Serializable;
import java.security.SecureRandom;
import java.util.UUID;

public class RandomIdentifierGenerator implements IdentifierGenerator {

  private final static SecureRandom sr = new SecureRandom();

  public Serializable generate(SessionImplementor sessionImplementor, Object o) throws HibernateException {
    long val = sr.nextLong();
    return Long.toString(Math.abs(val), Character.MAX_RADIX);
  }
}

IdentitfierGenerator - это интерфейс гибернации, который вы должны реализовать.Приведенный выше пример просто генерирует случайный идентификатор.

Чтобы использовать это, вы должны установить generator в mypackage.RandomIdentifierGenerator

Очевидно, что в этой реализации нет никакой гарантии того, что этот идентификатор не будет генерироваться.дважды, это может или не может быть важным для приложения, которое вы пишете.

0 голосов
/ 07 мая 2014

Я использую это для генерации первичного ключа: java.util.UUID.randomUUID (). ToString (). ReplaceAll ("-", "");

Он сгенерирует 32-значный первичный ключ, например: 1b694a70285f49c8a25a5de598042e7b.

У него мало шансов получить дублированный первичный ключ с помощью этого подхода.используйте это с Hibernate GeneratedValue.Пример кода должен быть следующим:

@GeneratedValue(generator="UUIdentifier")
@GenericGenerator(name="UUIdentifier", strategy = "uuid")
private String resourceId;

UUID, установленный для стратегии, предоставляется Hibernate, вы можете использовать свой собственный класс Java, задавая стратегию с использованием квалифицированного имени вашего собственного класса.

0 голосов
/ 26 октября 2010

В настоящее время я использую последовательности Oracle для достижения этой цели, но это очень дорогой способ по мере увеличения взаимодействия с базой данных.

Вы уверены, что использование последовательностей Oracle стоит дорого?Как упоминали другие комментаторы, это маловероятно.Сказав это, вы должны попытаться использовать последовательности, которые увеличиваются более чем на 1. Использование таких последовательностей вместе с hi-lo или pooled оптимизаторами , вероятно, будет работать хорошо.Это гарантирует, что Hibernate Session будет попадать в базу данных только один раз при N вставках, если N - размер приращения последовательности.Недостатком является то, что вам придется использовать отдельный столбец create_time для определения порядка вставки строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...