Hibernate Unknown integral data type for ids

hibernate, java

Solution

If you want String to be database key you need to use UUID to automatically generate key. Something like this:

@Id @GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy = "uuid")
private String myId;

UPDATE

The way of doing has evolved to the following usage

import org.hibernate.annotations.UuidGenerator;
// other code 
@Id
@UuidGenerator
public String id;

Problem

I'm starting with Hibernate and I have an error that I just can't figure out. I have the following Classes: ``` @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class AbstractColumn { @Id @GeneratedValue(strategy = GenerationType.AUTO) private String id; private String name; //Other stuff } ``` Then I have ``` @Entity public class DoubleColumn extends AbstractColumn implements Column { @ElementCollection private Map<Double,String> isNA; private double min=0; private double max=0; @ElementCollection private List<Double> data; // a lot of stuff } ``` And finally: ``` @Entity public class DataFrame { @OneToMany(cascade = CascadeType.ALL) @PrimaryKeyJoinColumn private List<AbstractColumn> data; private String name; @Id @GeneratedValue private String id; @ElementCollection private Map<String,Integer> colIndex; //more stuff } ``` The error I'm getting is: ``` Exception in thread "main" org.hibernate.id.IdentifierGenerationException: Unknown integral data type for ids : java.lang.String at org.hibernate.id.IdentifierGeneratorHelper.getIntegralDataTypeHolder(IdentifierGeneratorHelper.java:224) at org.hibernate.id.enhanced.SequenceStructure$1.getNextValue(SequenceStructure.java:98) at org.hibernate.id.enhanced.NoopOptimizer.generate(NoopOptimizer.java:40) at org.hibernate.id.enhanced.SequenceStyleGenerator.generate(SequenceStyleGenerator.java:432) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:105) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:675) at org.hibernate.internal.SessionImpl.save(SessionImpl.java:667) at org.hibernate.internal.SessionImpl.save(SessionImpl.java:662) at Main.main(Main.java:285) ``` The only hint that the error throws is that the error is in the main class here: ``` DoubleColumn c1 = new DoubleColumn("Datos varios"); c1.addData(12); c1.addData(11); c1.addData(131); c1.addData(121); c1.addData(151); c1.addData(116); DataFrame datosHibernate = new DataFrame("Dataframe Hibernate"); datosHibernate.addColumn(c1); Configuration hibernateConfig = new Configuration(); SessionFactory sessionFactory = hibernateConfig.configure().buildSessionFactory(); Session session = sessionFactory.openSession(); session.beginTransaction(); session.save(datosHibernate); session.getTransaction().commit(); session.disconnect(); session.close(); System.exit(0); ``` The ids are Strings, and I have them annotated as @GeneratedValue (I think I do not need to initialize them myself). The relation @OneToMany have the cascade annotation so it should be mapped correctly. I've tried the code WITHOUT the session.save line and doesn't throw errors, so is not a problem in the code per se, it has to be something with Hibernate. My configuration file is: ``` <hibernate-configuration> <session-factory> <property name="connection.url">jdbc:h2:E:/bd;DB_CLOSE_DELAY=-1;MVCC=TRUE</property> <property name="connection.driver_class">org.h2.Driver</property> <property name="connection.username">user</property> <property name="connection.password"></property> <property name="dialect">org.hibernate.dialect.H2Dialect</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">create</property> <mapping class="com.dataframe.estructuras.DataFrame"></mapping> <mapping class="com.dataframe.estructuras.column.AbstractColumn"/> <mapping class="com.dataframe.estructuras.column.types.DoubleColumn"/> </session-factory> </hibernate-configuration> ``` It creates the database file and I see all the SQL code generated, tables and all. Is when it tries to store the info when the thing breaks.

Original source