Стратегия генератора HiLo не работает

Я новичок в спящем режиме. То, что я пытаюсь сделать, это использовать @CollectionId для генерации идентификатора для моего класса Address. Для этого я использовал интерфейс Collection. Однако, когда я использую @GenericGenerator и устанавливаю стратегию в hilo, он выдает исключение. Здесь мой код:

@Entity
@Table(name = "USER_DETAILS")
public class UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int userId;
    private String userName;

    @ElementCollection
    @JoinTable(name="USER_ADDRESS",
        [email protected](name="USER_ID")
    )

    @GenericGenerator(name = "hilo-gen", strategy = "hilo")
    @CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "hilo-gen", type = @Type(type="long"))
    private Collection<Address> address = new ArrayList<Address>();

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Collection<Address> getAddress() {
        return address;
    }

    public void setAddress(List<Address> address) {
        this.address = address;
    }
}

Я получаю следующее исключение:

Exception in thread "main" org.hibernate.MappingException: Could not instantiate id generator [entity-name=null]
    at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.createIdentifierGenerator(DefaultIdentifierGeneratorFactory.java:121)
    at org.hibernate.mapping.SimpleValue.createIdentifierGenerator(SimpleValue.java:259)
    at org.hibernate.persister.collection.AbstractCollectionPersister.<init>(AbstractCollectionPersister.java:429)
    at org.hibernate.persister.collection.BasicCollectionPersister.<init>(BasicCollectionPersister.java:57)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.hibernate.persister.internal.PersisterFactoryImpl.createCollectionPersister(PersisterFactoryImpl.java:152)
    at org.hibernate.persister.internal.PersisterFactoryImpl.createCollectionPersister(PersisterFactoryImpl.java:140)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:408)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
    at com.hbt.HibernateTest.main(HibernateTest.java:35)
Caused by: java.lang.UnsupportedOperationException: Support for 'hilo' generator has been removed
    at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.getIdentifierGeneratorClass(DefaultIdentifierGeneratorFactory.java:132)
    at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.createIdentifierGenerator(DefaultIdentifierGeneratorFactory.java:112)
    ... 14 more

Я использую последний спящий режим. Что мне делать?

Ответ 1

Hilo больше не поддерживается, это должно работать

@GenericGenerator(name="sequence-gen",strategy="sequence")

Ответ 2

Если мы используем mysql, было бы лучше использовать стратегию @GenericGenerator of increment.

  1. последовательность - стратегия такого рода поддерживается Oracle, Postgresql.
  2. приращение - MySql поддерживает такую стратегию.

    @ElementCollection
    @JoinTable(name="USER_ADDRESS", [email protected](name="USER_ID"))
    @GenericGenerator(name = "increment-gen", strategy = "increment")
    @CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "increment-gen", type = @Type(type="long"))
    private Collection<Address> listOfAddress = new ArrayList<>();
    

Когда я использовал стратегию sequence с MySql, я столкнулся с проблемой, когда мой ADDRESS_ID не увеличивается должным образом.

SEQUENCE_STRATEGY_ISSUE

Ответ 3

Поддержка генератора 'hilo' удалена. Для получения дополнительной информации эта ссылка дает вам устаревший список.

Чтобы преодолеть это, вы можете просто использовать генератор последовательности . Это решит вашу проблему.

@Entity
@Table(name = "USER_DETAILS")
public class UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int userId;
    private String userName;

    @ElementCollection
    @JoinTable(name="USER_ADDRESS",
        [email protected](name="USER_ID")
    )

    @GenericGenerator(name = "sequence-gen", strategy = "sequence")
    @CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "sequence-gen", type = @Type(type="long"))
    private Collection<Address> address = new ArrayList<Address>();

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Collection<Address> getAddress() {
        return address;
    }

    public void setAddress(List<Address> address) {
        this.address = address;
    }
}

Ответ 4

Вы должны выбрать одну из стратегий Hi/Lo:

Чтобы быть как можно ближе к вашему учебнику, я просто изменил бы "hilo" на "seqhilo" в вашем коде.

Ответ 5

Я бы порекомендовал вам попробовать любое из 2 приведенных ниже решений, и это решит вашу проблему. это соответствует спецификации, приведенной в Hibernate 5.2.X.

Источник информации -https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html

Решение 1 -

 @GenericGenerator(name = "product_generator",strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator")
 @CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "product_generator", type = @Type(type="long"))*

Решение 2 -

*@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "product_generator")
 @CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "product_generator", type = @Type(type="long"))*

Дай мне знать, если это тебе поможет.

Ответ 6

К вашему сведению, MYSQL поддерживает стратегию последовательности, однако имя таблицы не должно содержать дефис '-' (это имя указано в @GenericGenerator (name) может вызвать исключение DDL при создании таблицы последовательности в MySQL.

Ответ 7

Это то, что работает для приложений на PostgreSQL. Хотя я не проверял это, оно должно работать для всех БД. Обратите внимание, что increment-gen используется не в последовательности.

@ElementCollection
    @JoinTable( name = "user_address", joinColumns = @JoinColumn( name = "user_id"))
    @GenericGenerator(name="increment-gen",strategy="increment")
    @CollectionId( columns = { @Column( name ="address_id") }, generator ="increment-gen", type [email protected]( type ="long"))
    private Collection<Address> listOfAddresses = new ArrayList<Address>();