Re: [JDBC] Cannot insert to 'path' field using EclipseLink

Поиск
Список
Период
Сортировка
От Steven Schlansker
Тема Re: [JDBC] Cannot insert to 'path' field using EclipseLink
Дата
Msg-id 9C61BFB9-E3C8-4CCC-AEB3-21D9B67A9642@gmail.com
обсуждение исходный текст
Ответ на Re: Cannot insert to 'path' field using EclipseLink  (Daryl Foster <daryl.foster@oncenter.com>)
Список pgsql-novice


On Mar 12, 2014, at 10:12 AM, Daryl Foster <daryl.foster@oncenter.com> wrote:

java.lang.ClassCastException: org.postgresql.geometric.PGpath cannot be cast to org.postgresql.geometric.PGpath


That's a sure sign of ClassLoader confusion. Make sure there is only one copy of the driver jar in your application or the JBoss container, but never both. 


On Wed, Mar 12, 2014 at 7:37 AM, Daryl Foster <daryl.foster@oncenter.com> wrote:
I have a java app running in JBoss that uses EclipseLink to persist to a Postgres database. I've added a field with a 'path' datatype to one of the tables but I keep getting the following exception when I try to insert data:

org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of org.postgresql.geometric.PGpath. Use setObject() with an explicit Types value to specify the type to use.

Here's the table definition:

    CREATE TABLE schema.table_name
    (
        item_id    uuid NOT NULL,
        item_path  path NOT NULL
    )

The java entity is representing the item_path field as a List<Point> object, and I'm using a converter to map from the List<Point> object to a PGpath object:

    import org.eclipse.persistence.mappings.DatabaseMapping;
    import org.eclipse.persistence.mappings.converters.Converter;
    import org.eclipse.persistence.sessions.Session;
    import org.postgresql.geometric.PGpath;
    import java.awt.Point;
    import java.util.ArrayList;
    import java.util.List;
    import static java.sql.Types.OTHER;

    public class PgPathConverter implements Converter
    {
        @Override
        public boolean isMutable ()
        {
            return false;
        }

        @Override
        public List<Point> convertDataValueToObjectValue (Object value, Session session)
        {
            // Code that converts PGpath to List<Point>
        }

        @Override
        public PGpath convertObjectValueToDataValue (Object value, Session session)
        {
            // Code that converts List<Point> to PGpath
        }

        @Override
        public void initialize (DatabaseMapping mapping, Session session)
        {
            mapping.getField ().setSqlType (OTHER);
        }
    }

The entity class is defined as follows:

    @Entity
    @Table (
        name           = "table_name",
        schema         = "schema"
    )
    @Converter (
        name           = "path",
        converterClass = PgPathConverter.class
    )
    public class TableName
    {
        public TableName () {}
        private static final long serialVersionUID = 1L;

        @Column (name = "item_path")
        @Convert ("path")
        private List<Point> m_ItemPath;

        @Id
        @Column (
            name     = "item_id",
            unique   = true,
            nullable = false
        )
        private UUID        m_ItemId;

        public UUID getItemId ()
        {
            return m_ItemId;
        }

        public List<Point> getItemPath ()
        {
            return m_InkPath;
        }

        public void setItemId (UUID itemId)
        {
            m_ItemId = itemId;
        }

        public void setInkPath (List<Point> itemPath)
        {
             m_ItemPath = itemPath;
        }
    }

Finally, here's the exception I get when I call `EntityManager.persist (entity)`:

    18:10:33,789 ERROR [org.jboss.as.ejb3] (http-/0.0.0.0:8080-1) javax.ejb.EJBTransactionRolledbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
    Internal Exception: org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of org.postgresql.geometric.PGpath. Use setObject() with an explicit Types value to specify the type to use.
    Error Code: 0
    Call: INSERT INTO schema.table_name (item_id, item_path) VALUES (?, ?)
bind => [2 parameters bound]
    18:10:33,789 ERROR [org.jboss.as.ejb3.invocation] (http-/0.0.0.0:8080-1) JBAS014134: EJB Invocation failed on component TableNameRepository for method public void com.mycompany.myproject.data.Repository.flush() throws javax.persistence.TransactionRequiredException,javax.persistence.PersistenceException: javax.ejb.EJBTransactionRolledbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
    Internal Exception: org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of org.postgresql.geometric.PGpath. Use setObject() with an explicit Types value to specify the type to use.
    Error Code: 0
    Call: INSERT INTO schema.table_name (item_id, item_path VALUES (?, ?)
bind => [2 parameters bound]
        at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleInCallerTx(CMTTxInterceptor.java:138) [jboss-as-ejb3-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
        at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:228) [jboss-as-ejb3-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:317) [jboss-as-ejb3-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:214) [jboss-as-ejb3-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-2.jar:1.1.1.Final-redhat-2]
at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41) [jboss-as-ejb3-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-2.jar:1.1.1.Final-redhat-2]
at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64) [jboss-as-ejb3-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-2.jar:1.1.1.Final-redhat-2]
at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:59) [jboss-as-ejb3-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-2.jar:1.1.1.Final-redhat-2]
at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) [jboss-as-ee-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-2.jar:1.1.1.Final-redhat-2]
at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:55) [jboss-as-ejb3-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-2.jar:1.1.1.Final-redhat-2]
at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45) [jboss-as-ee-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-2.jar:1.1.1.Final-redhat-2]
at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.1.Final-redhat-2.jar:1.1.1.Final-redhat-2]
at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:165) [jboss-as-ee-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:182) [jboss-as-ee-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-2.jar:1.1.1.Final-redhat-2]
at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.1.Final-redhat-2.jar:1.1.1.Final-redhat-2]
at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:72) [jboss-as-ee-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
...
--

Sincerely,

Daryl Foster




--

Sincerely,

Daryl Foster
Software Engineer

On Center Software, Inc.

P: 281.210.0177F: 281.297.9001
W: www.oncenter.com

В списке pgsql-novice по дате отправления:

Предыдущее
От: Daryl Foster
Дата:
Сообщение: Re: Cannot insert to 'path' field using EclipseLink
Следующее
От: JORGE MALDONADO
Дата:
Сообщение: Relational loops in a DB