-------- Original Message -------- Subject: OJB Framework: Bugs and Questions Date: Sun, 17 Nov 2002 21:34:38 -0000 From: "Werner Schulz" <[EMAIL PROTECTED]> Reply-To: <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]>
Dear Thomas, Sorry to write in english, but in technical matters like this one, it just flows easier. We have started to use the OJB framework for a big J2EE application since it fits our needs best (not too complicated but with sufficient SQL-like features like programmatic queries) which other OR frameworks seem to lack. So I am quite happy about using OJB. However, I have come across some problems, mainly due to my (lack of)understanding of OJB, but in a few cases due to bugs. On a more fundamental level, I would like to understand the implications J2EE has on the use of OJB. The docs are still somewhat thin here. >From what you will see below, I've got J2EE and OJB running for some very simple stuff. But I haven't yet tested the core elements of J2EE (concurrency->threads and transactions) and OJB's behaviour. Just answers to some basic questions would help me a great deal: a) We are using the PersistenceBrokerFactory straight as in aBroker = PersistenceBrokerFactory .createPersistenceBroker( new PBKey("repository.xml") ); since I can't seem to see a way to initiate it otherwise using Oracle's J2EE (EJB 1.1) 9iAS server. (The suggested Jboss setup just doesn't apply for us.) Any experience/reasons why this approach may be incorrect? b) If I call the broker factory several times in methods that are part of a J2EE transaction, will the rollback work correctly? I.e., if I avoid any call to transactions via OJB, will my J2EE transactions work as expected? Two cases which I think are bugs: a) (can't find the class but somewhere) the OJB properties file is called in from the classpath and the string ".properties" is attached, then the resource is called in. I think the file extension must not be used when using a ResourceBundle to read properties since this is automatically attached. b) a more fundamental error occurs when handling 1:N associations. I am using my own class for primary/foreign keys. When a contained object in a collection is assigned the id of the containing object, OJB uses the type since it has converted the primary key(s) of the containing object already into the SQL type. Example: I have a List (id:PK,name:String) where PK is my own PrimaryKey class (I have also written a converter for this, it maps PK to BIGINT and vice versa). List contains entries, where an entry has the fields (id:PK, parentid:PK, name:String, ...) When storing the List object, I get an exception since OJB tries to set the parentid with a java.lang.Long value. I have identified the lines of code that are causing this: (OJB 0.9.7) In class org.apache.ojb.broker.singlevm.PersistenceBrokerImpl (version 1.58) in method "assertFkAssignment" (line 653) there is a call: fld.getPersistentField().set(obj, refPkValues[i]); Here the PK object "refPkValues[i]" has the wrong type (Long instead of PK). This is due to the keys returned from class org.apache.ojb.broker.metadata.ClassDescriptor (version 1.30) in method "getKeyValues" where values are converted to their SQL types in line 841. Since values here are set on the Java level, it is obviously wrong to use key values that have been converted to SQL-compatible values (ie. my PK is now a Long, etc.) I have not checked whether M:N associations are also affected by this. (I will soon find out since they coming soon.) A Suggestion beyond current OJB: I would like to see a more sophisticated approach when setting values. I don't like to expose default constructors when a proper object model would use constructor arguments when creating an object. Hence I would like to replace the setters with constructors that take arguments. One could place constructor instructions into the mapping file: <class-descriptor ...> <constructor> <field refid="1"/> <field refid="3"/> <field refid="4"/> <constructor> <field ..../> </class-descriptor> which means that field 1,3,4 should be set in the constructor but not necessarily later via setters. (Getters are required since one needs to store the fields somehow!) I am looking forward to hearing from you. Best regards, Werner Werner Schulz Cambridge, UK work: [EMAIL PROTECTED] home: [EMAIL PROTECTED] -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>