One thing I notice that is different about your implementation (from mine) is that your table name does not directly match your class name. I think that _shouldn't_ matter, but it is a difference. There are few other differences too.
I notice your jdo file is full of ojb-extensions to specify table names, user name and such. This also differs from mine. Mine looks like this (one class only shown, generated by Xdoclet)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jdo PUBLIC "-//Sun Microsystems, Inc.//DTD Java Data Objects Metadata 1.0//EN" "http://java.sun.com/dtd/jdo_1_0.dtd">
<jdo>
<package name="org.cs101.fdb.impl.jdo">
<class name="LocationBase"
identity-type="application"
> <!-- end class tag -->
</class>
</package><!--
To use additional vendor extensions, create a vendor-extensions.xml file that
contains the additional extensions (in extension tags) and place it in your
projects merge dir.
-->
</jdo>
What is working for me is Xdoclet generated repository_user.xml, Xdoclet generated package.jdo, and MySQL. Torque is creating the database tables for me at runtime, though creating the tables at build time or independantly should suffice so long as nothing silly happens like creating tables in one db and then connecting to another. Insert usual caveats about everything staying in sync here...
One direction you might take is to cut back to letting everything fall into default naming and see if it works, then if it does, add in your customizations one by one to see what breaks it.
Looking at your extension elements, I also just wondered this... did you specify your user name and password in repository.xml (repository_database.xml)? Granted the error message is very odd if that is the type of problem here, but...
-Gus
Sebastian Muench wrote:
Hi,
at first, thank you for help so far. Unfortunately, the error message is still appearing. I checked the information given by the doc you referred me to, Gus. The strange thing at all is, that I can make new objects persistent without problems. But retrieving collections is still the problem. I checked and doublechecked everything, but don't know where's the problem.
My persistente class is House. I'm testing on the HSQLDB, comming with OJB. I prepare my user class for enhancing by compiling it as usual, and copy the class files to my dir target/classes/"<package>"/ and target/classestest/"<package>"/ As I already wrote, enhancing is successful.
Here some important lines from my repository_jdo.xml, House.jdo, House.java, etc.
SQL statement for the table in HSQLDB
CREATE TABLE Seb_House ( ID INTEGER NOT NULL PRIMARY KEY, NAME VARCHAR)
Corresponding mapping tags in repository_jdo.xml
<!-- Definitions for dbsii.House --> <class-descriptor class="dbsii.House" table="Seb_House" > <field-descriptor name="id" column="ID" jdbc-type="INTEGER" primarykey="true" /> <field-descriptor name="name" column="NAME" jdbc-type="VARCHAR" /> </class-descriptor>
The persistente class file
package dbsii;
import java.io.Serializable;
class House implements Serializable {
private int id; protected String name;
public House() { }
public House(int id, String name) { this.id = id; this.name = name; }
public int getId() { return this.id; }
public String getName() { return this.name; }
public void setId(int id) { this.id = id; }
public void setName(String name) { this.name = name; }
public String toString() { return "[" + this.id + "] " + this.name; }
}
The corresponding House.jdo
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jdo PUBLIC "-//Sun Microsystems, Inc.//DTD Java Data Objects Metadata 1.0//EN" "http://java.sun.com/dtd/jdo_1_0.dtd">
<jdo>
<!--extension vendor-name="ojb" key="dbplatform" value="hsqldb"/> <extension vendor-name="ojb" key="dbjdbc-level" value="2.0"/> <extension vendor-name="ojb" key="dbdriver" value="org.hsqldb.jdbcDriver"/> <extension vendor-name="ojb" key="dbprotocol" value="jdbc"/> <extension vendor-name="ojb" key="dbsubprotocol" value="hsqldb"/> <extension vendor-name="ojb" key="dbalias" value="../OJB"/> <extension vendor-name="ojb" key="dbusername" value="sa"/> <extension vendor-name="ojb" key="dbpassword" value=""/-->
<package name="dbsii">
<class name="House"> <extension vendor-name="ojb" key="table" value="Seb_House"/>
<field name="id"> <extension vendor-name="ojb" key="column" value="ID"/> </field> <field name="name"> <extension vendor-name="ojb" key="column" value="NAME"/> </field> </class> </package> </jdo>
The lines causing the error (pretty the same as in the jdo tutorial)
manager = factory.getPersistenceManager();
try {
// JDO does not like old instances... PersistenceBrokerFactory.defaultPersistenceBroker().clearCache();
manager.currentTransaction().begin(); Query query = manager.newQuery(House.class);
// >>> NEXT LINE CAUSES THE ERROR <<< Collection all = (Collection)query.execute();
// now iterate over the result to print each product java.util.Iterator iter = all.iterator(); if (! iter.hasNext()) { System.out.println("No Product entries found!"); }
while (iter.hasNext()) { House house = (House) iter.next(); System.out.println(house.toString()); }
}
...
The error message
[JDO] DEBUG: OjbStoreConnector.begin: connectionReadyForRelease=false org.apache.ojb.broker.PersistenceBrokerException: Unable to build object instance (MAYBE you don't have a constructor available):class dbsii.House at org.apache.ojb.broker.accesslayer.RowReaderDefaultImpl.buildWithReflection(R owReaderDefaultImpl.java:239) at org.apache.ojb.broker.accesslayer.RowReaderDefaultImpl.readObjectFrom(RowRea derDefaultImpl.java:115) at org.apache.ojb.broker.accesslayer.RsIterator.getObjectFromResultSet(RsIterat or.java:428) at org.apache.ojb.broker.accesslayer.RsIterator.next(RsIterator.java:256) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryRe ferenceBroker.java:147) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryRe ferenceBroker.java:244) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryRe ferenceBroker.java:263) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Persis tenceBrokerImpl.java:998) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQuery( DelegatingPersistenceBroker.java:322) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQuery( DelegatingPersistenceBroker.java:322) at org.apache.ojb.jdori.sql.OjbExtent.<init>(OjbExtent.java:98) at org.apache.ojb.jdori.sql.OjbStoreManager.getExtent(OjbStoreManager.java:251) at com.sun.jdori.common.PersistenceManagerImpl.getExtent(Unknown Source) at com.sun.jdori.common.query.QueryImpl.checkCandidates(Unknown Source) at com.sun.jdori.common.query.QueryImpl.execute(Unknown Source) at dbsii.Frontend.getHouseListings(Frontend.java:148) at dbsii.Frontend.run(Frontend.java:68) at dbsii.Frontend.main(Frontend.java:40) Caused by: org.apache.ojb.broker.metadata.ClassNotPersistenceCapableException: (Could not instantiate dbsii.House: Class org.apache.ojb.broker.util.ConstructorHelper can not access a member of class dbsii.House with modifiers "public") at org.apache.ojb.broker.util.ConstructorHelper.instantiate(ConstructorHelper.j ava:162) at org.apache.ojb.broker.accesslayer.RowReaderDefaultImpl.buildWithReflection(R owReaderDefaultImpl.java:235) ... 17 more Caused by: java.lang.IllegalAccessException: Class org.apache.ojb.broker.util.ConstructorHelper can not access a member of class dbsii.House with modifiers "public" at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:57) at java.lang.reflect.Constructor.newInstance(Constructor.java:268) at org.apache.ojb.broker.util.ConstructorHelper.instantiate(ConstructorHelper.j ava:158) ... 18 more [org.apache.ojb.broker.accesslayer.RsIterator] ERROR: Unable to build object instance (MAYBE you don't have a constructor available):class dbsii.House org.apache.ojb.broker.PersistenceBrokerException: Unable to build object instance (MAYBE you don't have a constructor available):class dbsii.House at org.apache.ojb.broker.accesslayer.RowReaderDefaultImpl.buildWithReflection(R owReaderDefaultImpl.java:239) at org.apache.ojb.broker.accesslayer.RowReaderDefaultImpl.readObjectFrom(RowRea derDefaultImpl.java:115) at org.apache.ojb.broker.accesslayer.RsIterator.getObjectFromResultSet(RsIterat or.java:428) at org.apache.ojb.broker.accesslayer.RsIterator.next(RsIterator.java:256) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryRe ferenceBroker.java:147) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryRe ferenceBroker.java:244) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryRe ferenceBroker.java:263) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Persis tenceBrokerImpl.java:998) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQuery( DelegatingPersistenceBroker.java:322) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQuery( DelegatingPersistenceBroker.java:322) at org.apache.ojb.jdori.sql.OjbExtent.<init>(OjbExtent.java:98) at org.apache.ojb.jdori.sql.OjbStoreManager.getExtent(OjbStoreManager.java:251) at com.sun.jdori.common.PersistenceManagerImpl.getExtent(Unknown Source) at com.sun.jdori.common.query.QueryImpl.checkCandidates(Unknown Source) at com.sun.jdori.common.query.QueryImpl.execute(Unknown Source) at dbsii.Frontend.getHouseListings(Frontend.java:148) at dbsii.Frontend.run(Frontend.java:68) at dbsii.Frontend.main(Frontend.java:40) Caused by: org.apache.ojb.broker.metadata.ClassNotPersistenceCapableException: (Could not instantiate dbsii.House: Class org.apache.ojb.broker.util.ConstructorHelper can not access a member of class dbsii.House with modifiers "public") at org.apache.ojb.broker.util.ConstructorHelper.instantiate(ConstructorHelper.j ava:162) at org.apache.ojb.broker.accesslayer.RowReaderDefaultImpl.buildWithReflection(R owReaderDefaultImpl.java:235) ... 17 more Caused by: java.lang.IllegalAccessException: Class org.apache.ojb.broker.util.ConstructorHelper can not access a member of class dbsii.House with modifiers "public" at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:57) at java.lang.reflect.Constructor.newInstance(Constructor.java:268) at org.apache.ojb.broker.util.ConstructorHelper.instantiate(ConstructorHelper.j ava:158) ... 18 more org.apache.ojb.broker.PersistenceBrokerException: java.util.NoSuchElementException: Could not obtain next object: Unable to build object instance (MAYBE you don't have a constructor available):class dbsii.House at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryRe ferenceBroker.java:251) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryRe ferenceBroker.java:263) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Persis tenceBrokerImpl.java:998) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQuery( DelegatingPersistenceBroker.java:322) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQuery( DelegatingPersistenceBroker.java:322) at org.apache.ojb.jdori.sql.OjbExtent.<init>(OjbExtent.java:98) at org.apache.ojb.jdori.sql.OjbStoreManager.getExtent(OjbStoreManager.java:251) at com.sun.jdori.common.PersistenceManagerImpl.getExtent(Unknown Source) at com.sun.jdori.common.query.QueryImpl.checkCandidates(Unknown Source) at com.sun.jdori.common.query.QueryImpl.execute(Unknown Source) at dbsii.Frontend.getHouseListings(Frontend.java:148) at dbsii.Frontend.run(Frontend.java:68) at dbsii.Frontend.main(Frontend.java:40) Caused by: java.util.NoSuchElementException: Could not obtain next object: Unable to build object instance (MAYBE you don't have a constructor available):class dbsii.House at org.apache.ojb.broker.accesslayer.RsIterator.next(RsIterator.java:276) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryRe ferenceBroker.java:147) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryRe ferenceBroker.java:244) ... 12 more Exception in thread "main" javax.jdo.JDOUserException: Cannot close PersistenceManager while transaction is still active. at com.sun.jdori.common.PersistenceManagerImpl.close(Unknown Source) at com.sun.jdori.common.PersistenceManagerImpl.popCurrentWrapper(Unknown Source) at com.sun.jdori.common.PersistenceManagerWrapper.close(Unknown Source) at dbsii.Frontend.getHouseListings(Frontend.java:170) at dbsii.Frontend.run(Frontend.java:68) at dbsii.Frontend.main(Frontend.java:40)
-----Urspr�ngliche Nachricht----- Von: Gus Heck [mailto:[EMAIL PROTECTED] Gesendet: Samstag, 20. Dezember 2003 00:17 An: OJB Users List Betreff: Re: AW: AW: JDO - Unable to build object instance
This may interest you:
http://www.mail-archive.com/[EMAIL PROTECTED]/msg03320.html
HTH, Gus
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
