HiLo发电机策略不起作用

我是hibernate的新手。 我想要做的是使用@CollectionId为我的Address类生成一个标识符。 我已经使用了Collection接口。 但是,当我使用@GenericGenerator并将策略设置为hilo时,它会抛出exception。 这是我的代码:

 @Entity @Table(name = "USER_DETAILS") public class UserDetails { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int userId; private String userName; @ElementCollection @JoinTable(name="USER_ADDRESS", joinColumns=@JoinColumn(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 = new ArrayList
(); 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
getAddress() { return address; } public void setAddress(List
address) { this.address = address; } }

我得到以下exception:

 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.(AbstractCollectionPersister.java:429) at org.hibernate.persister.collection.BasicCollectionPersister.(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.(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 

我正在使用最新的hibernate。 我该怎么办?

Hilo不再受支持,这应该可行

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

‘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", joinColumns=@JoinColumn(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 = new ArrayList
(); 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
getAddress() { return address; } public void setAddress(List
address) { this.address = address; } }

如果我们使用mysql,最好使用增量策略的@GenericGenerator

  1. 序列 – 这种策略由Oracle支持Postgresql。
  2. increment – 这种策略由MySql支持。

     @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 = @Type(type="long")) private Collection
    listOfAddress = new ArrayList<>();

当我使用MySql的序列策略时,我遇到了一个问题,即我的ADDRESS_ID没有正确递增。

SEQUENCE_STRATEGY_ISSUE

您必须从Hi / Lo策略中选择一个:

  • SequenceHiLoGenerator :用序列支持Hi
  • MultipleHiLoPerTableGenerator :用表格支持Hi

为了尽可能接近您的教程,我只需在代码中将“hilo”更改为“seqhilo”。

我建议您尝试以下任何一种解决方案 ,它将解决您的问题。 它符合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"))* 

如果它对您有所帮助,请告诉我。