openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rusanov Dmitry (JIRA)" <j...@apache.org>
Subject [jira] Commented: (OPENJPA-69) Null reference from one Entity to other causes fault with OpenJPA 0.9.0 and Apache Derby 10.1 when byte[] used as identity
Date Mon, 30 Oct 2006 09:21:17 GMT
    [ http://issues.apache.org/jira/browse/OPENJPA-69?page=comments#action_12445525 ] 
            
Rusanov Dmitry commented on OPENJPA-69:
---------------------------------------

Stack trace is on OpenJPA 0.9.0 (openjpa-project-0.9.0-incubating.zip) and Apache Derby 10.1.2.1
Complete stack trace is here:
---------------------------------------

<2|true|0.9.0-incubating> org.apache.openjpa.persistence.RollbackException: The transaction
has been rolled back.  See the nested exceptions for details on the errors that occurred.
	at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:387)
	at app.WriteData.main(WriteData.java:28)
Caused by: <0|true|0.9.0-incubating> org.apache.openjpa.persistence.PersistenceException:
The transaction has been rolled back.  See the nested exceptions for details on the errors
that occurred.
	at org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2081)
	at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1928)
	at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1826)
	at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1757)
	at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:76)
	at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1314)
	at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:863)
	at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:376)
	... 1 more
Caused by: <0|false|0.9.0-incubating> org.apache.openjpa.persistence.PersistenceException:
An attempt was made to get a data value of type 'CHAR () FOR BIT DATA' from a data value of
type 'BLOB'.
	at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:3729)
	at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:94)
	at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:80)
	at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:56)
	at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:70)
	at org.apache.openjpa.jdbc.kernel.OperationOrderUpdateManager.flushPrimaryRow(OperationOrderUpdateManager.java:200)
	at org.apache.openjpa.jdbc.kernel.OperationOrderUpdateManager.flush(OperationOrderUpdateManager.java:86)
	at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:86)
	at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:69)
	at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:512)
	at org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:127)
	... 8 more
Caused by: SQL Exception: An attempt was made to get a data value of type 'CHAR () FOR BIT
DATA' from a data value of type 'BLOB'.
	at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:80)
	at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:87)
	at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Util.java:173)
	at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(EmbedConnection.java:1911)
	at org.apache.derby.impl.jdbc.ConnectionChild.newSQLException(ConnectionChild.java:180)
	at org.apache.derby.impl.jdbc.EmbedPreparedStatement.dataTypeConversion(EmbedPreparedStatement.java:1328)
	at org.apache.derby.impl.jdbc.EmbedPreparedStatement.setNull(EmbedPreparedStatement.java:282)
	at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.setNull(DelegatingPreparedStatement.java:270)
	at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.setNull(LoggingConnectionDecorator.java:932)
	at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.setNull(DelegatingPreparedStatement.java:270)
	at org.apache.openjpa.jdbc.sql.DBDictionary.setNull(DBDictionary.java:958)
	at org.apache.openjpa.jdbc.sql.DBDictionary.setTyped(DBDictionary.java:1070)
	at org.apache.openjpa.jdbc.sql.RowImpl.flush(RowImpl.java:876)
	at org.apache.openjpa.jdbc.sql.RowImpl.flush(RowImpl.java:835)
	at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:90)
	at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:68)
	... 14 more
----------------

In my opinion root of the problem could be found near  'org.apache.openjpa.jdbc.sql.DBDictionary.setTyped(DBDictionary.java:1070)',
where value NULL is assigned to database column. In case of NULL value SQL-type of this NULL
is taken from OpenJPA metadata, where type of column has been determined as BLOB (corresponding
object field is reference to object with id of byte[]). This time database table field has
type CHAR(16) FOR BIT DATA. Derby detects that types are different and rejects assignment.
In case of non-NULL values SQL-type of assigned value determined on value itself.


> Null reference from one Entity to other causes fault with OpenJPA 0.9.0 and Apache Derby
10.1 when byte[] used as identity
> --------------------------------------------------------------------------------------------------------------------------
>
>                 Key: OPENJPA-69
>                 URL: http://issues.apache.org/jira/browse/OPENJPA-69
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: jpa
>         Environment: Windows XP, Java SE 1.5 (Sun JRE 1.5_06)
>            Reporter: Rusanov Dmitry
>         Attachments: sample.zip
>
>
> Suppose we have following stuff:
> Foo.java:
> ------------
> package entity;
> import javax.persistence.Column;
> import javax.persistence.Entity;
> import javax.persistence.Id;
> import javax.persistence.IdClass;
> import javax.persistence.ManyToOne;
> import javax.persistence.Table;
> @Entity
> @Table(name="FOO")
> @IdClass(BinaryId.class)
> public class Foo
> {
>     @Id
>     @Column(name="ID", length=16, nullable=false)
>     private byte[] id;
>     @ManyToOne
>     private Bar bar;
>     public void setId(byte[] id)
>     {
>         this.id = id;
>     }
>     public byte[] getId()
>     {
>         return id;
>     }
>     
>     public void setBar(Bar bar)
>     {
>         this.bar = bar;
>     }
>     public Bar getBar()
>     {
>         return bar;
>     }
> }
> Bar.java
> -----------
> package entity;
> import javax.persistence.Column;
> import javax.persistence.Entity;
> import javax.persistence.Id;
> import javax.persistence.IdClass;
> import javax.persistence.Table;
> @Entity
> @Table(name="FOO")
> @IdClass(BinaryId.class)
> public class Bar
> {
>     @Id
>     @Column(name="ID", length=16, nullable=false)
>     private byte[] id;
>     @Column(length=32)
>     private String name;
>     public void setId(byte[] id)
>     {
>         this.id = id;
>     }
>     public byte[] getId()
>     {
>         return id;
>     }
>     
>     public void setName(String name)
>     {
>         this.name = name;
>     }
>     public String getName()
>     {
>         return name;
>     }
> }
> BinaryId.java (Identity class for byte[] identity):
> --------------------------------------------
> package entity;
> public class BinaryId
> {
>     private byte[] id;
>     
>     public boolean equals(Object other)
>     {
>         if (other == this)
>             return true;
>         if (!(other instanceof BinaryId))
>             return false;
>         BinaryId bi = (BinaryId)other;
>         if (id == bi.id)
>             return true;
>         if (id == null)
>             return false;
>         if (id.length != bi.id.length)
>             return false;
>         for (int i = 0; i < id.length; i++)
>         {
>             if (id[i] != bi.id[i])
>                 return false;
>         }
>         return true;
>     }
>     
>     public int hashCode()
>     {
>         if (id == null)
>             return 0;
>         int hash = 0;
>         for (int i = 0; i < id.length; i++)
>             hash += id[i];
>         return hash;
>     }
> }
> persistence.xml
> ----------------------
> <persistence xmlns="http://java.sun.com/xml/ns/persistence"
> 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> 	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
> 	version="1.0">
> 	<persistence-unit name="openjpa">
>         <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
>         <class>entity.Foo</class>
>         <class>entity.Bar</class>
>         <properties>
>             <property name="openjpa.ConnectionURL" value="jdbc:derby:c:/derbydb/ojpa-bug"/>
>             <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
>             <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/>
>         </properties>
>     </persistence-unit>
> </persistence>
> create.sql
> -------------
> CREATE TABLE APP.foo (
>   id CHAR(16) FOR BIT DATA NOT NULL, 
>   bar_id CHAR(16) FOR BIT DATA,
>   PRIMARY KEY(id) );
> CREATE TABLE APP.bar (
>   id CHAR(16) FOR BIT DATA NOT NULL, 
>   name VARCHAR(32),
>   PRIMARY KEY(id) );
>     
> With all this stuff following portion of code causes exception:
>         EntityManagerFactory emf = Persistence.createEntityManagerFactory("openjpa");
>         EntityManager entityManager = emf.createEntityManager();
>         Foo foo = new Foo();
>         byte[] id = new byte[16];
>         for (int i = 0; i < 16; i++)
>             id[i] = (byte)(i + 16);
>         foo.setId(id);
>         
>         EntityTransaction txn = entityManager.getTransaction();
>         try
>         {
>             txn.begin();
>             entityManager.persist(foo);
>             txn.commit();
>         }
>         catch (Exception e)
>         {
>             e.printStackTrace();
>         }
> If run the same code with  MS SQL Server 2000 in place of Derby everything is working.
Seems to me this problem is caused by typed nature of NULL in Apache Derby. If so the same
problem should be with IBM DB2.
> I couldn't attach full packaged sample (don't know how). But I can send it if needed.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message