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 。
- 序列 – 这种策略由Oracle支持Postgresql。
-
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没有正确递增。
您必须从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"))*
如果它对您有所帮助,请告诉我。
- 何时在Java中使用LinkedList over ArrayList?
- LinkedHashSet .equals()vs LinkedList .equals()具有相同的元素但顺序不同
- 合并Map <String,List Java 8 Stream
- 如何迭代PriorityQueue?
- java concurrent Array List访问
- 通过Collections.synchronizedSet(…)。forEach()的迭代是否保证是线程安全的?
- Java 8:使用lambda表达式初始化HashMap
- 重复的对象被添加到列表中
- 将结果集值放入Collection对象,然后添加到ArrayList