On Sat, 29 May 2004 00:17:15 +0200, Stefan Frank wrote:

>
>Hello everybody
>
>I got into trouble with Castor and PostgreSQL. I'm currently using Castor 
>0.9.5.3 and PostgreSQL 7.4.2 with the pg74.213.jdbc3.jar JDBC-driver.
>
>I have several problems:
>
>Connection-Pooling:
>
>If my database.xml looks like this:
><---------------------------------------------------------------------->
><database name="dbsa" engine="postgresql">
>  <data-source class-name="org.postgresql.jdbc2.optional.PoolingDataSource">
>       <params server-name="localhost" database-name="dbsa"
>               initial-connections="2" max-connections="10"
>               user="dbsa" password="seminarverwaltung" />
>  </data-source>
>  <mapping href="res/dbsa-mapping.xml" />
></database>
><---------------------------------------------------------------------->
>I get errors like this:
><---------------------------------------------------------------------->
>Exception: org.exolab.castor.mapping.MappingException: Nested error: 
>java.lang.NullPointerException
>org.exolab.castor.jdo.DatabaseNotFoundException: No configuration loaded for 
>database dbsa -- use the JDO interface to load a configuration for this 
>database
>       at org.exolab.castor.jdo.JDO.getDatabase(JDO.java:601)
>       at ch.fhz.hta.dbsa.server.db.ModifyBroker.<init>(ModifyBroker.java:54)
>       at Test.<init>(Test.java:49)
>       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
>       at 
>sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
>       at 
>sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
>       at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
>       at junit.framework.TestSuite.createTest(TestSuite.java:131)
>       at junit.framework.TestSuite.addTestMethod(TestSuite.java:114)
>       at junit.framework.TestSuite.<init>(TestSuite.java:75)
>       at 
>org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.getTest(RemoteTestRunner.java:349)
>       at 
>org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:387)
>       at 
>org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:294)
>       at 
>org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:182)
><---------------------------------------------------------------------->
>If I use instead the normal driver like this:
><---------------------------------------------------------------------->
><database name="dbsa" engine="postgresql">
>  <driver url="jdbc:postgresql://localhost/dbsa" 
>class-name="org.postgresql.Driver">
>    <param name="user" value="dbsa" />
>    <param name="password" value="seminarverwaltung" />
>  </driver>
>  <mapping href="res/dbsa-mapping.xml" />
></database>
><---------------------------------------------------------------------->
>everything works fine. I don't know wheter PostgreSQL 7.4 supports 
>connection-pooling. I just read that version 7.2 should have support for it. 
>Or must I use Poolman as a pooling manager?
>
>Well the next point is much more important. In the documentation is only 
>written that database-locking works with Oracle and Sybase. But it is nowhere 
>mentioned that it also works with PostgreSQL. But on the other hand in the 
>JDO-FAQ it is written, that PostgreSQL supports the main functions of Castor.

Can you please point me the exact place of this, and I will amend the docs accordingly.

>Because we are developing a three tier client, we can't use caching. The cache 
>is disabled and we are requesting every object direct from the database. As a 
>consequence we must lock a record on the database as soon as we want to 
>modify the desired object (the business-layer is distributed on different 
>machines). 
>
>I tried to load the object with access-mode (short)3.
>
>But then PostgreSQL complains:
><---------------------------------------------------------------------->
>May 28, 2004 11:47:31 PM org.exolab.castor.jdo.engine.SQLEngine load
>SEVERE: A fatal error occurred while loading 
>ch.fhz.hta.dbsa.server.entities.Organization using SQL: SELECT 
>"room"."room_id","organization"."address","organization"."city","organization"."contact_person_department","organization"."contact_person_first_n
ame","organization"."contact_person_last_name","organization"."contact_person_telefon_number","organization"."fax_number","organization"."nam
e","organization"."organization_size","organization"."short_name","organization"."telefon_number","organization"."zip_code","organization"."is_delet
ed","organization"."last_edited" 
>FROM "organization" LEFT OUTER JOIN "room" ON 
>"organization"."organization_id"="room"."organization_id" WHERE 
>"organization"."organization_id"=? FOR UPDATE
>org.postgresql.util.PSQLException: ERROR: SELECT FOR UPDATE cannot be applied 
>to the nullable side of an outer join
><---------------------------------------------------------------------->
>The problem is obviously, that the Organization-Object holds a collection of 
>Rooms (a reference would also lead to the error). But as long as this 
>collection is empty (or the reference is null), PostgreSQL complains about 
>the nullable side of the outer join.
>
>Is there any solution available?
>
>And my last question is about lazy loading.
>I have the Room class with a relation (1:1) to the Organization class.

Well, actually you happen to have a 1:M relation here, correct ?

><---------------------------------------------------------------------->
>class Room {
>  private Collection m_oOrganization;
>(...)
>  public void setM_oOrganization (Collection organization) {}
>  public Collection getM_oOrganization ()
>}
><---------------------------------------------------------------------->
>class Organization { (..) }
><---------------------------------------------------------------------->
><class name="Room" (...)>
>               <map-to table="room" />
>               <cache-type type="none" />
>               <field name="m_oOrganization" type="Organization" lazy="true" 
>collection="collection">
>                       <sql name="organization_id" />
                                               ^^^^^^^^^^^^^^^^^^^^^^^^
>               </field>
>(...)
><---------------------------------------------------------------------->
>As soon as I call the create(Object)-method and pass a Room-object
>I receive following error:
><---------------------------------------------------------------------->
>org.exolab.castor.jdo.PersistenceException: Nested error: 
>java.lang.NumberFormatException: For input string: "[]"
>       at 
>org.exolab.castor.persist.TransactionContext.create(TransactionContext.java:921)
>       at org.exolab.castor.jdo.engine.DatabaseImpl.create(DatabaseImpl.java:363)
>       at ch.fhz.hta.dbsa.server.db.ModifyBroker.createRoom(ModifyBroker.java:177)
><---------------------------------------------------------------------->
^
I think that the problem here is with the way the <sql> element is defined. In this 
definition, you have to point to the 'many-key' portion of the primary key 
of M_oOrganization (assuming that such a class exists). Iow, 

<field name="m_oOrganization" type="Organization" lazy="true" collection="collection">
    <sql name="organization_id" />
</field>

should change to 

<field name="m_oOrganization" type="Organization" lazy="true" collection="collection">
    <sql many-key="room_id" />
</field>


assuming that the table definition for M_oOrganization includes a column 'room_id' 
that is part of the primary key.

>
>Regards,
>
>Stefan
>
>       
>
>
>
>----------------------------------------------------------- 
>If you wish to unsubscribe from this mailing, send mail to
>[EMAIL PROTECTED] with a subject of:
>        unsubscribe castor-user
>



----------------------------------------------------------- 
If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
        unsubscribe castor-user

Reply via email to