Reputation: 323
I am new to hibernate. What I am trying to do is use @CollectionId
to generate an identifier for my Address class. I have used Collection
interface for this. However when I use @GenericGenerator
and set strategy to hilo, it throws an Exception.
Here's my code:
@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> 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;
}
}
I get the following 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.<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
I am using the latest hibernate. What should I do?
Upvotes: 14
Views: 10207
Reputation: 2296
This is what works for apps on PostgreSQL. Though I have not tested it, it should work for all DBs. Note that increment-gen
is used not sequence.
@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<Address> listOfAddresses = new ArrayList<Address>();
Upvotes: 1
Reputation: 11
FYI, MYSQL supports sequence strategy however table name should not contain hyphen '-' (which is name provided in @GenericGenerator(name) could cause DDL exception while creating sequence table in mysql.
Upvotes: 1
Reputation: 1
I would recommend you to try any of the below 2 solutions and it will fix your issue. it is as per the specification provided in Hibernate 5.2.X.
Source Of Info -https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html
Solution 1 -
@GenericGenerator(name = "product_generator",strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator")
@CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "product_generator", type = @Type(type="long"))*
Solution 2 -
*@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "product_generator")
@CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "product_generator", type = @Type(type="long"))*
Let me know if it helps you.
Upvotes: 0
Reputation: 2593
If we are using mysql it would be better to use the @GenericGenerator of increment strategy.
increment - This sort of strategy supports by 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<Address> listOfAddress = new ArrayList<>();
When I have used the sequence strategy with MySql I came across an issue where my ADDRESS_ID is not getting incremented properly.
Upvotes: 12
Reputation: 12757
The Support for 'hilo' generator has been removed. For additional information, this link gives you the deprecated list.
To overcome this, you can simply use sequence generator. This will solve your problem.
@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> 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;
}
}
Upvotes: 1
Reputation: 1100
You must choose from one of the Hi/Lo strategy :
To be as close as your tutorial as possible, I would simply change "hilo" to "seqhilo" in your code.
Upvotes: 0
Reputation: 498
Hilo is not supported anymore, this should work
@GenericGenerator(name="sequence-gen",strategy="sequence")
Upvotes: 33