On Feb 7, 2007, at 1:55 PM, Patrick Linskey wrote:

It's coming from the generated bytecode which expects there
to be a getId
method that returns the same type of the Id, however
java.sql.Date is using
the same ID class as java.util.Date. Do we need a separate class for
java.sql.Date?

It looks like we either need a separate type for java.sql.Date (and
presumably java.sql.Timestamp), or we need to change the logic to accept
a getId() method that returns a type that is assignable from the id
field's type.

It's probably cleaner if we have separate classes for the different types. That is, have the getId method in the new org.apache.openjpa.util.SQLDateId return the proper type (java.sql.Date). After all, java.sql.{Date, Time, Timestamp} are not really the same as java.util.Date.

Craig

-Patrick

--
Patrick Linskey
BEA Systems, Inc.

______________________________________________________________________ _ Notice: This email message, together with any attachments, may contain information of BEA Systems, Inc., its subsidiaries and affiliated entities, that may be confidential, proprietary, copyrighted and/or legally privileged, and is intended solely for the use of the individual or entity named in this message. If you are not the intended recipient, and have received this message in error, please immediately return this
by email and then delete it.

-----Original Message-----
From: Michael Dick [mailto:[EMAIL PROTECTED]
Sent: Wednesday, February 07, 2007 12:57 PM
To: open-jpa-dev@incubator.apache.org
Subject: Exception when using java.sql.Date as an id

Hi,

I'm getting the following exception when I try to fetch an
entity with a
java.sql.Date as the id :

java.lang.NoSuchMethodError: org.apache.openjpa.util.DateId.getId
()Ljava/sql/Date;
    at mikedd.entities.SqlDatePK.pcCopyKeyFieldsFromObjectId
(SqlDatePK.java
)
    at mikedd.entities.SqlDatePK.pcNewInstance(SqlDatePK.java)
    at
org.apache.openjpa.enhance.PCRegistry.newInstance(PCRegistry.java
:118)
    at org.apache.openjpa.kernel.StateManagerImpl.initialize (
StateManagerImpl.java:247)
    at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initializeState(
JDBCStoreManager.java:327)
    at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initialize(
JDBCStoreManager.java:252)
    at org.apache.openjpa.kernel.DelegatingStoreManager.initialize(
DelegatingStoreManager.java:108)
    at org.apache.openjpa.kernel.ROPStoreManager.initialize(
ROPStoreManager.java:54)
    at org.apache.openjpa.kernel.BrokerImpl.initialize
(BrokerImpl.java:868)
    at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:826)
    at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:743)
    at org.apache.openjpa.kernel.DelegatingBroker.find (
DelegatingBroker.java:169)
    at org.apache.openjpa.persistence.EntityManagerImpl.find(
EntityManagerImpl.java:346)
    at
mikedd.tests.TestSqlDateId.testFindAfterClear(TestSqlDateId.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(
NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(
DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke (Method.java:585)
    at junit.framework.TestCase.runTest(TestCase.java:154)
    . . .

It's coming from the generated bytecode which expects there
to be a getId
method that returns the same type of the Id, however
java.sql.Date is using
the same ID class as java.util.Date. Do we need a separate class for
java.sql.Date?

Here's the entity and testcase that I'm running (in case I
missed something
along the way)

Entity :
import java.sql.Date;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class SqlDatePK {

    @Id
    private Date id;
    private String name;

    . . .
}

Testcase :
public void testFindAfterClear() {
        SqlDatePK sql;

        EntityManager em = _emf.createEntityManager();

        long ms = 101010;  // arbitrary date.
        java.sql.Date date = new java.sql.Date(ms);

        em.getTransaction().begin();

        sql = new SqlDatePK();
        sql.setId(date);
        em.persist(sql);

        em.getTransaction().commit();

        em.clear();
        sql = null;
        sql = em.find(SqlDatePK.class, date);

     . . .
}

Thanks in advance,
--
-Michael Dick


Craig Russell
Architect, Sun Java Enterprise System http://java.sun.com/products/jdo
408 276-5638 mailto:[EMAIL PROTECTED]
P.S. A good JDO? O, Gasp!

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to