Hi,
What if I convert to/from byte array with (see the attached java number
utility class):
NumberUtils.toByteArray(UUID uuid)
NumberUtils.toUUID(byte[] value)
Miro.
Miroslav Nachev wrote:
Yes, you are right. With the correct code:
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
TestTable1 testTable = new TestTable1(uuid);
persist(testTable);
}
the exception is:
Hibernate: insert into test_db.public.test_table_1 (description,
my_id) values (?, ?)
2008-12-18 0:58:39 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: null
2008-12-18 0:58:39 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Batch entry 0 insert into test_db.public.test_table_1
(description, my_id) values (NULL, '<stream of 80 bytes>') was
aborted. Call getNextException to see the cause.
2008-12-18 0:58:39 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: 42804
2008-12-18 0:58:39 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERROR: column "my_id" is of type uuid but expression is of
type bytea
Hint: You will need to rewrite or cast the expression.
Position: 55
2008-12-18 0:58:39
org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.exception.SQLGrammarException: Could not execute JDBC
batch update
at
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
at
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
at
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
at
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at
org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at
org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at
org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at
org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
at psqluuidtest.Main.persist(Main.java:34)
at psqluuidtest.Main.main(Main.java:25)
Caused by: java.sql.BatchUpdateException: Batch entry 0 insert into
test_db.public.test_table_1 (description, my_id) values (NULL,
'<stream of 80 bytes>') was aborted. Call getNextException to see the
cause.
at
org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2556)
at
org.postgresql.core.v3.QueryExecutorImpl$1.handleError(QueryExecutorImpl.java:395)
at
org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1348)
at
org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:343)
at
org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2693)
at
org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
... 10 more
javax.persistence.RollbackException: Error while commiting the
transaction
at
org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71)
at psqluuidtest.Main.persist(Main.java:34)
at psqluuidtest.Main.main(Main.java:25)
Caused by: org.hibernate.exception.SQLGrammarException: Could not
execute JDBC batch update
at
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
at
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
at
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
at
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at
org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at
org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at
org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at
org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
... 2 more
Caused by: java.sql.BatchUpdateException: Batch entry 0 insert into
test_db.public.test_table_1 (description, my_id) values (NULL,
'<stream of 80 bytes>') was aborted. Call getNextException to see the
cause.
at
org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2556)
at
org.postgresql.core.v3.QueryExecutorImpl$1.handleError(QueryExecutorImpl.java:395)
at
org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1348)
at
org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:343)
at
org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2693)
at
org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
... 10 more
Exception in thread "main" java.lang.IllegalStateException:
Transaction not active
at
org.hibernate.ejb.TransactionImpl.rollback(TransactionImpl.java:82)
at psqluuidtest.Main.persist(Main.java:37)
at psqluuidtest.Main.main(Main.java:25)
Miro.
Kris Jurka wrote:
Miroslav Nachev wrote:
I try to use it but I have the following exception:
java.lang.IllegalArgumentException: Unknown entity: java.util.UUID
at
org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:223)
at psqluuidtest.Main.persist(Main.java:33)
at psqluuidtest.Main.main(Main..java:25)
Surely you want to persist a TestTable1 instance, not the uuid itself.
Kris Jurka
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.cosmos.util;
import java.math.BigInteger;
import java.util.UUID;
/**
*
* @author Miro
*/
public class NumberUtils
{
public static byte[] toByteArray(short value)
{
return toByteArray(value, 2);
}
public static byte[] toByteArray(int value)
{
return toByteArray(value, 4);
}
public static byte[] toByteArray(long value)
{
return toByteArray(value, 8);
}
public static byte[] toByteArray(UUID uuid)
{
byte[] firstBytes = toByteArray(uuid.getMostSignificantBits());
byte[] secondBytes = toByteArray(uuid.getLeastSignificantBits());
return append(firstBytes, secondBytes);
}
private static byte[] toByteArray(long value, int length)
{
byte[] result = new byte[length];
for(int i = 0; i < length; i++)
{
result[i] = (byte)(value & 0xFF);
value >>>= 8;
}
return result;
}
/**
* Appends two bytes array into one.
*
* @param a A byte[].
* @param b A byte[].
* @return A byte[].
*/
public static byte[] append(byte[] a, byte[] b)
{
byte[] z = new byte[a.length + b.length];
System.arraycopy(a, 0, z, 0, a.length);
System.arraycopy(b, 0, z, a.length, b.length);
return z;
}
public static short toShort(byte[] value)
{
return toShort(value, 0);
}
public static short toShort(byte[] value, int beginPos)
{
return (short)toNumber(value, beginPos, 2);
}
public static int toInt(byte[] value)
{
return toInt(value, 0);
}
public static int toInt(byte[] value, int beginPos)
{
return (int)toNumber(value, beginPos, 4);
}
public static long toLong(byte[] value)
{
return toLong(value, 0);
}
public static long toLong(byte[] value, int beginPos)
{
return toNumber(value, beginPos, 8);
}
private static long toNumber(byte[] value, int beginPos, int length)
{
if(value == null || value.length == 0)
return 0;
if(length > 8)
length = 8;
if((beginPos + length) > value.length)
length = value.length - beginPos;
if(length == 0)
return 0;
int endPos = beginPos + length;
long result = 0;
for(int i = (endPos - 1); i >= beginPos; i--)
{
int b = value[i] & 0xFF;
result |= b;
if(i > beginPos)
result <<= 8;
}
return result;
}
public static UUID toUUID(byte[] value)
{
return toUUID(value, 0);
}
public static UUID toUUID(byte[] value, int beginPos)
{
if(value.length < beginPos + 16)
throw new IllegalArgumentException("The length (" + value.length +
") of bytes is less than required (" + beginPos + 16 +
").");
long mostSigBits = toLong(value, beginPos);
long leastSigBits = toLong(value, beginPos + 8);
return new UUID(mostSigBits, leastSigBits);
}
public static UUID toUUID(BigInteger intValue)
{
return toUUID(intValue.toByteArray());
}
public static BigInteger toBigInteger(UUID uuid)
{
return new BigInteger(toByteArray(uuid));
}
public static void main(String[] args)
{
try
{
long l = 123456;
System.out.println("l: " + l);
byte[] ba = toByteArray(l);
l = toLong(ba);
System.out.println("l: " + l);
l = -123456;
System.out.println("l: " + l);
ba = toByteArray(l);
l = toLong(ba);
System.out.println("l: " + l);
int i = 123456;
System.out.println("i: " + i);
ba = toByteArray(i);
i = toInt(ba);
System.out.println("i: " + i);
i = -123456;
System.out.println("i: " + i);
ba = toByteArray(i);
i = toInt(ba);
System.out.println("i: " + i);
short s = 12345;
System.out.println("s: " + s);
ba = toByteArray(s);
s = toShort(ba);
System.out.println("s: " + s);
s = -12345;
System.out.println("s: " + s);
ba = toByteArray(s);
s = toShort(ba);
System.out.println("s: " + s);
UUID uuid1 = UUID.randomUUID();
System.out.println("uuid1: " + uuid1);
ba = toByteArray(uuid1);
UUID uuid2 = toUUID(ba);
System.out.println("uuid2: " + uuid2);
System.out.println("uuid1.equals(uuid2): " + uuid1.equals(uuid2));
BigInteger intValue1 = toBigInteger(uuid1);
uuid2 = toUUID(intValue1);
System.out.println("uuid1.equals(uuid2): " + uuid1.equals(uuid2));
BigInteger intValue2 = toBigInteger(uuid2);
System.out.println("intValue1.equals(intValue2): " +
intValue1.equals(intValue2));
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs