Hi Dmitry,
I don't know what's going wrong when running the tutorial (seems that
Product.class was correctly enhanced by the JDO enhancer).
But I wouldn't recommend OJB's JDO 1.0-api implementation for production
environments.
The PB-api and ODMG-api are stable and ready for production use
http://db.apache.org/ojb/status.html
If you want to use JDO, please have a look at JPOX or Speedo (or other
projects)
http://www.jpox.org/index.jsp
http://speedo.objectweb.org/
regards,
Armin
Dmitry Litvintsev wrote:
Hi,
I am developing a java application and I am considering OJB technology to
store objects' states seamlessly in the PostgreSQL database.
In short I am failing to get tutorial5 up and running. I followed
instructions on this link:
http://db.apache.org/ojb/docu/tutorials/jdo-tutorial.html
My actions:
1) downloaded ojb-blank.jar
2) downloaded tutorial5-src.jar
3) downloaded db-ojb-1.0.4.jar
4) downloaded jdo.jar,jdori-enhancer.jar,jdori.jar (jdo 1.0.1 RI)
5) downloaded PostgreSQL drivers pg74.216.jdbc3.jar postgresql-8.1-405.jdbc3.jar
my top directory is "ojb-blank"
I put *jar files into lib (ojb-blank/lib)
I put tutorial5 sources to (ojb_blank/src/java/org/apache/ojb/tutorial5)
I modified buid.properties, so it looks like this:
jcdAlias=default
databaseName=ojb
databaseUser=postgres
databasePassword=
dbmsName=PostgreSQL
jdbcLevel=3.0
jdbcRuntimeDriver=org.postgresql.Driver
urlProtocol=jdbc
urlSubprotocol=postgresql
urlDbalias=//localhost/${databaseName}
torque.database=postgresql
torque.database.createUrl=${urlProtocol}:${urlSubprotocol}:${urlDbalias}
jar.name=my-project.jar
source.dir=src
source.java.dir=${source.dir}/java
source.resource.dir=${source.dir}/resources
source.test.dir=${source.dir}/test
source.schema.dir=${source.dir}/schema
build.dir=build
lib.dir=lib
target.dir=target
I do not recall changing build.xml.
1) DB setup
ant build setup-db
runs w/ errors, but it creates *.sql files which I run byu hand and next
time around
ant build setup-db
runs w/o errors. So I consider it is a success:
$ psql ojb
Welcome to psql 8.0.3, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
ojb=# \d
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------+----------
public | ojb_dlist | table | postgres
public | ojb_dlist_entries | table | postgres
public | ojb_dmap | table | postgres
public | ojb_dmap_entries | table | postgres
public | ojb_dset | table | postgres
public | ojb_dset_entries | table | postgres
public | ojb_hl_seq | table | postgres
public | ojb_nrm | table | postgres
public | product | table | postgres
(9 rows)
2) ant build
$ ant build
Buildfile: build.xml
compile:
[mkdir] Created dir: /data/postgres/ojb/ojb-blank/build
[mkdir] Created dir: /data/postgres/ojb/ojb-blank/build/classes
[javac] Compiling 9 source files to
/data/postgres/ojb/ojb-blank/build/classes
xdoclet:
[ojbdoclet] 2006-04-18 18:33:08,102 [main] INFO xdoclet.XDocletMain.start -
Running <ojbrepository/>
[ojbdoclet] Generating ojb repository descriptor
(build/repository_user.xml)
[ojbdoclet] Type org.apache.ojb.tutorial5.Product
[ojbdoclet] Processed 1 types
[ojbdoclet] Processed 1 types
[ojbdoclet] 2006-04-18 18:33:08,493 [main] INFO xdoclet.XDocletMain.start -
Running <torqueschema/>
[ojbdoclet] Generating torque schema (build/database/project-schema.xml)
[ojbdoclet] Processed 1 types
build:
[copy] Copying 7 files to /data/postgres/ojb/ojb-blank/build
[mkdir] Created dir: /data/postgres/ojb/ojb-blank/build/lib
[copy] Copying 41 files to /data/postgres/ojb/ojb-blank/build/lib
build_if_with_mainclass:
[copy] Copying 2 files to /data/postgres/ojb/ojb-blank/build
BUILD SUCCESSFUL
Total time: 3 seconds
so I am encouraged , I proceed to the next step:
3) ant enhance-jdori
$ ant enhance-jdori
Buildfile: build.xml
compile:
xdoclet:
[ojbdoclet] 2006-04-18 18:34:35,546 [main] INFO xdoclet.XDocletMain.start - Running
<ojbrepository/>
[ojbdoclet] 2006-04-18 18:34:36,128 [main] INFO xdoclet.XDocletMain.start - Running
<torqueschema/>
build:
build_if_with_mainclass:
enhance-jdori:
[java] Enhancer: options:
[java] verbose = true
[java] quiet = false
[java] forceWrite = true
[java] noWrite = false
[java] sourcePath = null
[java] destinationDirectory = build/classes
[java] propertiesFileName = null
[java] doTiming = false
[java] classNames = {
[java] }
[java] jdoFileNames = {
[java] src/java/org/apache/ojb/tutorial5/Product.jdo
[java] }
[java] classFileNames = {
[java] build/classes/org/apache/ojb/tutorial5/Product.class
[java] }
[java] zipFileNames = {
[java] }
[java] dumpClass = false
[java] noAugment = false
[java] noAnnotate = false
[java] JDO ENHANCER: using file:
file:/data/postgres/ojb/ojb-blank/build/classes/org/apache/ojb/tutorial5/Product.class
[java] Class Locator: using class files: {
[java] build/classes/org/apache/ojb/tutorial5/Product.class
[java] }
[java] JDO ENHANCER: using file:
file:/data/postgres/ojb/ojb-blank/src/java/org/apache/ojb/tutorial5/Product.jdo
[java]
---------------------------------------------------------------------------
[java] JDO ENHANCER: Enhancer: enhancing classfile ...
[java] JDO ENHANCER: scanning class org.apache.ojb.tutorial5.Product
[java] JDO ENHANCER: not found resource: META-INF/package.jdo
[java] JDO ENHANCER: not found resource: WEB-INF/package.jdo
[java] JDO ENHANCER: not found resource: package.jdo
[java] JDO ENHANCER: not found resource: org/package.jdo
[java] JDO ENHANCER: not found resource: org/apache/package.jdo
[java] JDO ENHANCER: not found resource: org/apache/ojb/package.jdo
[java] JDO ENHANCER: not found resource:
org/apache/ojb/tutorial5/package.jdo
[java] JDO ENHANCER: found resource: org/apache/ojb/tutorial5/Product.jdo
[java] JDO ENHANCER: has default constructor.
[java] JDO ENHANCER: has not static initializer.
[java] JDO ENHANCER: has not clone method.
[java] JDO ENHANCER: has not writeObject method.
[java] JDO ENHANCER: has not writeReplace method.
[java] JDO ENHANCER: has not readObject method.
[java] JDO ENHANCER: has the specific JDO fields: false.
[java] JDO ENHANCER: has the specific JDO methods: false.
[java] JDO ENHANCER: has the specific JDO fields and methods: false.
[java] JDO ENHANCER: has the instance-callback JDO methods: false.
[java] JDO ENHANCER: has the instance-callback JDO methods: false.
[java] JDO ENHANCER: implements the JDO PersistenceCapable interface:
false.
[java] JDO ENHANCER: has the generic JDO fields: false.
[java] JDO ENHANCER: has the generic JDO methods: false.
[java] JDO ENHANCER: has the generic JDO fields and methods: false.
[java] JDO ENHANCER: augmenting class org.apache.ojb.tutorial5.Product
[java] JDO ENHANCER: adding: javax.jdo.spi.StateManager jdoStateManager
[java] JDO ENHANCER: adding: byte jdoFlags
[java] JDO ENHANCER: adding: void jdoReplaceFlags()
[java] JDO ENHANCER: adding: boolean jdoIsPersistent()
[java] JDO ENHANCER: adding: boolean jdoIsTransactional()
[java] JDO ENHANCER: adding: boolean jdoIsNew()
[java] JDO ENHANCER: adding: boolean jdoIsDeleted()
[java] JDO ENHANCER: adding: boolean jdoIsDirty()
[java] JDO ENHANCER: adding: void jdoMakeDirty(java.lang.String)
[java] JDO ENHANCER: adding: void jdoPreSerialize()
[java] JDO ENHANCER: adding: javax.jdo.PersistenceManager
jdoGetPersistenceManager()
[java] JDO ENHANCER: adding: java.lang.Object jdoGetObjectId()
[java] JDO ENHANCER: adding: java.lang.Object jdoGetTransactionalObjectId()
[java] JDO ENHANCER: adding: void
jdoReplaceStateManager(javax.jdo.spi.StateManager)
[java] JDO ENHANCER: adding: void jdoProvideFields(int[])
[java] JDO ENHANCER: adding: void jdoReplaceFields(int[])
[java] JDO ENHANCER: adding: java.lang.Class
sunjdo$classForName$(java.lang.String)
[java] JDO ENHANCER: adding: implements javax.jdo.spi.PersistenceCapable
[java] JDO ENHANCER: adding: int jdoInheritedFieldCount
[java] JDO ENHANCER: adding: java.lang.String[] jdoFieldNames
[java] JDO ENHANCER: adding: java.lang.Class[] jdoFieldTypes
[java] JDO ENHANCER: adding: byte[] jdoFieldFlags
[java] JDO ENHANCER: adding: java.lang.Class
jdoPersistenceCapableSuperclass
[java] JDO ENHANCER: adding: int jdoGetManagedFieldCount()
[java] JDO ENHANCER: adding: void <clinit>()
[java] JDO ENHANCER: adding: javax.jdo.spi.PersistenceCapable
jdoNewInstance(javax.jdo.spi.StateManager)
[java] JDO ENHANCER: adding: javax.jdo.spi.PersistenceCapable
jdoNewInstance(javax.jdo.spi.StateManager, java.lang.Object)
[java] JDO ENHANCER: adding: void jdoProvideField(int)
[java] JDO ENHANCER: adding: void jdoReplaceField(int)
[java] JDO ENHANCER: adding: void
jdoCopyField(org.apache.ojb.tutorial5.Product, int)
[java] JDO ENHANCER: adding: void jdoCopyFields(java.lang.Object, int[])
[java] JDO ENHANCER: adding: java.lang.Object jdoNewObjectIdInstance()
[java] JDO ENHANCER: adding: java.lang.Object
jdoNewObjectIdInstance(java.lang.String)
[java] JDO ENHANCER: adding: void
jdoCopyKeyFieldsToObjectId(java.lang.Object)
[java] JDO ENHANCER: adding: void
jdoCopyKeyFieldsFromObjectId(java.lang.Object)
[java] JDO ENHANCER: adding: void
jdoCopyKeyFieldsToObjectId(javax.jdo.spi.PersistenceCapable$ObjectIdFieldSupplier,
java.lang.Object)
[java] JDO ENHANCER: adding: void
jdoCopyKeyFieldsFromObjectId(javax.jdo.spi.PersistenceCapable$ObjectIdFieldConsumer,
java.lang.Object)
[java] JDO ENHANCER: adding: java.lang.Integer
jdoGetid(org.apache.ojb.tutorial5.Product)
[java] JDO ENHANCER: adding: void
jdoSetid(org.apache.ojb.tutorial5.Product, java.lang.Integer)
[java] JDO ENHANCER: adding: java.lang.String
jdoGetname(org.apache.ojb.tutorial5.Product)
[java] JDO ENHANCER: adding: void
jdoSetname(org.apache.ojb.tutorial5.Product, java.lang.String)
[java] JDO ENHANCER: adding: double
jdoGetprice(org.apache.ojb.tutorial5.Product)
[java] JDO ENHANCER: adding: void
jdoSetprice(org.apache.ojb.tutorial5.Product, double)
[java] JDO ENHANCER: adding: int
jdoGetstock(org.apache.ojb.tutorial5.Product)
[java] JDO ENHANCER: adding: void
jdoSetstock(org.apache.ojb.tutorial5.Product, int)
[java] JDO ENHANCER: adding: void writeObject(java.io.ObjectOutputStream)
[java] JDO ENHANCER: annotating class org.apache.ojb.tutorial5.Product
[java] JDO ENHANCER: annotating: org.apache.ojb.tutorial5.Product.getId()
[java] JDO ENHANCER: annotating:
org.apache.ojb.tutorial5.Product.setName(java.lang.String)
[java] JDO ENHANCER: annotating: org.apache.ojb.tutorial5.Product.<init>()
[java] JDO ENHANCER: annotating:
org.apache.ojb.tutorial5.Product.getPrice()
[java] JDO ENHANCER: annotating:
org.apache.ojb.tutorial5.Product.setPrice(double)
[java] JDO ENHANCER: annotating:
org.apache.ojb.tutorial5.Product.setStock(int)
[java] JDO ENHANCER: annotating:
org.apache.ojb.tutorial5.Product.toString()
[java] JDO ENHANCER: annotating:
org.apache.ojb.tutorial5.Product.getStock()
[java] JDO ENHANCER: annotating: org.apache.ojb.tutorial5.Product.getName()
[java] JDO ENHANCER: annotating:
org.apache.ojb.tutorial5.Product.setId(int)
[java] JDO ENHANCER: writing enhanced class
org.apache.ojb.tutorial5.Product to output stream
[java] JDO ENHANCER: Enhancer: classfile enhanced successfully.
[java] done.
BUILD SUCCESSFUL
Total time: 6 seconds
So I am extatic. I do:
4) cd build
chmod +x run.sh
./run.sh
bash: ./run.sh: Permission denied
[EMAIL PROTECTED] build]$ chmod +x run.sh
[EMAIL PROTECTED] build]$ ./run.sh
_ _
__ (_)| |_
/ _\| || _ \ ~ be persistent ~
\__/| ||___/ v. 1.0.4
/_/
Welcome to the OJB JDO RI tutorial application
[0] List all product entries
[1] Enter a new product
[2] Edit a product entry
[3] Delete a product entry
[4] Quit Application
type in number to select a use case
1
please enter a new product
enter name: casio
enter price: 10
enter available stock: 10
0 INFO [main] BOOT - -- boot log messages -->
21 DEBUG [main] JDO - OjbStoreConnector.begin:
connectionReadyForRelease=false
41 DEBUG [main] BOOT - Instantiate PersistenceBrokerFactory
64 INFO [main] BOOT - Loading OJB's properties:
file:/data/postgres/ojb/ojb-blank/build/OJB.properties
89 DEBUG [main] BOOT - No value for key "ObjectCacheClass", using default
org.apache.ojb.broker.cache.ObjectCacheDefaultImpl.
144 DEBUG [main] BOOT - Using logger class 'class
org.apache.ojb.broker.util.logging.Log4jLoggerImpl' for
org.apache.ojb.broker.core.proxy.AbstractProxyFactory
144 DEBUG [main] BOOT - Initializing logger instance
org.apache.ojb.broker.core.proxy.AbstractProxyFactory
180 DEBUG [main] BOOT - Using logger class 'class
org.apache.ojb.broker.util.logging.Log4jLoggerImpl' for
org.apache.ojb.broker.core.PersistenceBrokerFactoryBaseImpl1
180 DEBUG [main] BOOT - Initializing logger instance
org.apache.ojb.broker.core.PersistenceBrokerFactoryBaseImpl
180 DEBUG [main] BOOT - Using logger class 'class
org.apache.ojb.broker.util.logging.Log4jLoggerImpl' for
org.apache.ojb.broker.core.PersistenceBrokerFactoryDefaultImpl
181 DEBUG [main] BOOT - Initializing logger instance
org.apache.ojb.broker.core.PersistenceBrokerFactoryDefaultImpl
218 DEBUG [main] core.PersistenceBrokerFactoryDefaultImpl - PersistenceBroker
pool will be setup with the following configuration [EMAIL PROTECTED]
maxIdle=-1
maxActive=100
maxTotal=-1
maxWait=2000
whenExhaustedAction=0
testOnBorrow=false
testOnReturn=false
testWhileIdle=false
timeBetweenEvictionRunsMillis=-1
numTestsPerEvictionRun=10
minEvictableIdleTimeMillis=1000000
]
253 INFO [main] core.PersistenceBrokerFactoryDefaultImpl - Create
PersistenceBroker instance pool, pool configuration was
{whenExhaustedAction=0, maxIdle=-1, maxActive=100, maxWait=2000,
removeAbandoned=false, numTestsPerEvictionRun=10,
minEvictableIdleTimeMillis=1000000, testWhileIdle=false,
testOnReturn=false, logAbandoned=false, minIdle=0,
removeAbandonedTimeout=300, timeBetweenEvictionRunsMillis=-1,
testOnBorrow=false}
253 INFO [main] BOOT - PersistencebrokerFactory class instantiated: [EMAIL
PROTECTED]
274 DEBUG [main] BOOT - Using logger class 'class
org.apache.ojb.broker.util.logging.Log4jLoggerImpl' for
org.apache.ojb.broker.metadata.MetadataManager
275 DEBUG [main] BOOT - Initializing logger instance
org.apache.ojb.broker.metadata.MetadataManager
303 DEBUG [main] BOOT - Using logger class 'class
org.apache.ojb.broker.util.logging.Log4jLoggerImpl' for
org.apache.ojb.broker.metadata.RepositoryPersistor
303 DEBUG [main] BOOT - Initializing logger instance
org.apache.ojb.broker.metadata.RepositoryPersistor
326 INFO [main] metadata.RepositoryPersistor - OJB Descriptor Repository:
file:/data/postgres/ojb/ojb-blank/build/repository.xml
326 INFO [main] metadata.RepositoryPersistor - Building repository from
:file:/data/postgres/ojb/ojb-blank/build/repository.xml
370 INFO [main] metadata.RepositoryPersistor - RepositoryPersistor using
SAXParserFactory : org.apache.xerces.jaxp.SAXParserFactoryImpl
575 DEBUG [main] BOOT - Using logger class 'class
org.apache.ojb.broker.util.logging.Log4jLoggerImpl' for
org.apache.ojb.broker.metadata.DescriptorRepository
575 DEBUG [main] BOOT - Initializing logger instance
org.apache.ojb.broker.metadata.DescriptorRepository
611 DEBUG [main] BOOT - Using logger class 'class
org.apache.ojb.broker.util.logging.Log4jLoggerImpl' for
org.apache.ojb.broker.metadata.RepositoryXmlHandler
611 DEBUG [main] BOOT - Initializing logger instance
org.apache.ojb.broker.metadata.RepositoryXmlHandler
<SNIP> .... <SNIP> ot tons of debugging stuff
4240 INFO [main] accesslayer.ConnectionFactoryPooledImpl - Create new
connection
pool:[EMAIL PROTECTED]
jcd-alias=default
default-connection=true
dbms=PostgreSQL
jdbc-level=3.0
driver=org.postgresql.Driver
protocol=jdbc
sub-protocol=postgresql
db-alias=//localhost/ojb
user=postgres
password=*****
eager-release=false
ConnectionPoolDescriptor={whenExhaustedAction=0, maxIdle=-1,
maxActive=30, maxWait=10000, removeAbandoned=false,
numTestsPerEvictionRun=10, minEvictableIdleTimeMillis=600000,
testWhileIdle=false, testOnReturn=false, logAbandoned=false, minIdle=0,
fetchSize=0, removeAbandonedTimeout=300, timeBetweenEvictionRunsMillis=-1,
testOnBorrow=true}
batchMode=false
useAutoCommit=AUTO_COMMIT_SET_TRUE_AND_TEMPORARY_FALSE
ignoreAutoCommitExceptions=false
[EMAIL PROTECTED]
sequenceManagerClass=class
org.apache.ojb.broker.util.sequence.SequenceManagerHighLowImpl
Properties={autoNaming=true, seq.start=200000, grabSize=20}
]
]
4241 DEBUG [main] accesslayer.ConnectionFactoryPooledImpl - createPool was
called
4270 DEBUG [main] accesslayer.ConnectionFactoryPooledImpl - makeObject called
4368 DEBUG [main] accesslayer.ConnectionFactoryAbstractImpl - Create new
connection using DriverManager: [EMAIL PROTECTED]
4370 DEBUG [main] accesslayer.ConnectionManagerImpl - Request new connection
from ConnectionFactory: [EMAIL PROTECTED]
4390 DEBUG [main] accesslayer.ConnectionManagerImpl - localBegin was called
for con [EMAIL PROTECTED]
4391 DEBUG [main] accesslayer.ConnectionManagerImpl - Try to change autoCommit
state to 'false'
Missing JDO metadata for enhanced class 'org.apache.ojb.tutorial5.Product'.
com.sun.jdori.model.ModelFatalException: Missing JDO metadata for enhanced
class 'org.apache.ojb.tutorial5.Product'.
at
com.sun.jdori.common.model.jdo.JDOModelImpl.lookupXMLMetadata(Unknown Source)
at com.sun.jdori.common.model.jdo.JDOModelImpl.getJDOClass(Unknown
Source)
at com.sun.jdori.common.model.jdo.JDOModelImpl.getJDOClass(Unknown
Source)
at
com.sun.jdori.common.model.runtime.RuntimeJavaType.getJDOClass(Unknown Source)
at com.sun.jdori.common.state.StateManagerImpl.initializePC(Unknown
Source)
at com.sun.jdori.common.state.StateManagerImpl.<init>(Unknown Source)
at com.sun.jdori.common.state.StateManagerFactory.newInstance(Unknown
Source)
at com.sun.jdori.common.CacheManagerImpl.makePersistent(Unknown Source)
at
com.sun.jdori.common.PersistenceManagerImpl.makePersistentInternal(Unknown
Source)
at com.sun.jdori.common.PersistenceManagerImpl.makePersistent(Unknown
Source)
at
com.sun.jdori.common.PersistenceManagerWrapper.makePersistent(Unknown Source)
at org.apache.ojb.tutorial5.UCEnterNewProduct.apply(Unknown Source)
at org.apache.ojb.tutorial5.Application.run(Unknown Source)
at org.apache.ojb.tutorial5.Application.main(Unknown Source)
So You can see I am failing with "Missing JDO metadata for enhanced class
'org.apache.ojb.tutorial5.Product'"!
I would greatly appreciate yuor taking time looking into my problem and
hinting on what am I doing wrong! I have been stuck on this for a couple
of days and, I think, I exhausted my limited aresenal of knowldege.
additional info:
- I am running on FedoreCore 3
- I am running postgres 8.0.3
- I use j2sdk1.4.2_09
best regards,
Dmitri Litvintsev
---------------------------------------------------------------------
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]