2016-10-21 2 views
0

Я начинаю с Hibernate, и у меня есть ошибка, которую я просто не могу понять.Hibernate Неизвестный интегральный тип данных для идентификаторов

У меня есть следующие классы:

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class AbstractColumn { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private String id; 
    private String name; 

//Other stuff 
} 

Тогда я

@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 
} 

И, наконец:

@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 
} 

Ошибка я получаю:

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) 

Единственный намек, что ошибка бросает в том, что ошибка в главном классе здесь:

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); 

Идентификаторы строк, и я их аннотированный, как @GeneratedValue (я думаю, что не нужно инициализировать их себя). Отношение @OneToMany имеет каскадную аннотацию, поэтому она должна быть правильно отображена.

Я пробовал код БЕЗ строки session.save и не выдавал ошибок, поэтому это не проблема в коде как таковой, он должен быть чем-то с Hibernate.

Мой конфигурационный файл:

<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> 

Это создает файл базы данных, и я вижу весь код SQL сгенерированного, таблицы и все. Это когда он пытается сохранить информацию, когда вещь ломается.

ответ

3

Если вы хотите, чтобы строка была ключом базы данных, вам нужно использовать UUID для автоматического создания ключа. Что-то вроде этого:

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

И решить эту проблему, но у меня есть новая ошибка, если я могу нажать мою удачу и вставить его здесь ... на всякий случай: D –

+0

Это новая ошибка: Ошибка во время управляемого флеша [Batch update возвратил неожиданный счетчик строк из update [0]; фактическое количество строк: 0; ожидаемый: 1] Thx за помощь –

+0

Nevermind, решена. Я установил одну из идентификаторов в другой части. Кажется, все работает. Thx снова –

Смежные вопросы