I am editing this post as I figure things out. It appears that the IdentifierGeneratorFactory that is used to get a sequence value will only return long, integer, short or string (see code below).
Is there any reason why it shouldn't return a BigInteger (which is what should be mapped with an Oracle NUMBER)?
A side question - Is there any reason Oracle NUMBER can't be mapped to long?
I am thinking of adding a line in the get method to return BigInteger.
Code:
public static Serializable get(ResultSet rs, Type type)
throws SQLException, IdentifierGenerationException {
Class clazz = type.getReturnedClass();
if ( clazz==Long.class ) {
return new Long( rs.getLong(1) );
}
else if ( clazz==Integer.class ) {
return new Integer( rs.getInt(1) );
}
else if ( clazz==Short.class ) {
return new Short( rs.getShort(1) );
}
else if ( clazz==String.class ) {
return rs.getString(1);
}
else {
throw new IdentifierGenerationException("this id generator generates long, integer, short or string");
}
}
-----
Original post
-----
I have a table with a number column
CREATE TABLE N_CUSTOMER (
CUSTOMER_ID NUMBER NOT NULL,
POJO code:
public class NCustomer {
private BigInteger customerId;
Mapping:
<class name="NCustomer" table="N_CUSTOMER" optimistic-lock="none">
<id name="customerId" type="big_integer" unsaved-value="null">
<column name="CUSTOMER_ID" not-null="true" precision="22" scale="0"/>
<generator class="sequence">
<param name="sequence">SEQ_N_CUSTOMER</param>
</generator>
</id>
I have a sequence that returns a customer id (see error below). Do I need to create a Custom Mapping to convert the sequence value returned to a BigInteger?
With the log set to debug, I receive the following error on a save.
Code:
18:42:39,701 DEBUG SQL:346 - select IRMAIR.SEQ_N_CUSTOMER.nextval from dual
Hibernate: select IRMAIR.SEQ_N_CUSTOMER.nextval from dual
org.hibernate.id.IdentifierGenerationException: this id generator generates long, integer, short or string
at org.hibernate.id.IdentifierGeneratorFactory.get(IdentifierGeneratorFactory.java:59)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:78)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:91)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:530)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:518)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:514)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
at $Proxy0.save(Unknown Source)