At the moment I don't have an idea what else could be missing but I am sure that this should work as we have a test case for exactly this.

Could you please have a look at this test cases in the source distribution yourself.

src/tests/jdo/KeyGenSequence.java
src/tests/jdo/KeyGenGeneric.java
src/tests/jdo/TestSequenceObject.java
src/tests/jdo/mapping.xml
src/tests/jdo/oracle.sql

or

src/tests/jdo/KeyGenReturning.java
src/tests/jdo/KeyGenGeneric.java
src/tests/jdo/TestReturningObject.java
src/tests/jdo/mapping.xml
src/tests/jdo/oracle.sql

To run the tests you may have a look at the instructions on:

http://castor.codehaus.org/test-framework.html

1. You need to configure database connection
2. Execute oracle.sql script to setup tables
3. Compile tests by executing: build tests
4. Run tests by: test castor.oracle

You can also execute one test only by

for Sequence: test castor.oracle.TC42
for Returning: test castor.oracle.TC44

Hope that helps

Ralf


Eric Anderson schrieb:
Ah I see

Even replacing the key-generator with <key-generator name="SEQUENCE" alias="www_patient_comments_seq">
<param name="sequence" value="www_patient_comments_seq" />
<param name="returning" value="true" />
<param name="trigger" value="true" />
</key-generator>


or
<key-generator name="SEQUENCE" alias="www_patient_comments_seq">
        <param name="sequence" value="{0}_seq" />
        <param name="returning" value="true" />
        <param name="trigger" value="true" />
  </key-generator>



I still get

SEVERE: A fatal error occurred while creating
org.usiis.struts.CommentForm using
 SQL: {call INSERT INTO "WWW_PATIENT_COMMENTS"
("USIIS_ID","PATIENT_ID","PROVIDE
R_ID","DATE_CREATED","PAT_COMMENT","SHARE_FLAG") VALUES (?,?,?,?,?,?)
RETURNING
"PAT_COMMENT_ID" INTO ?}
java.sql.SQLException: ORA-01400: cannot insert NULL into
("HL_AIMS"."WWW_PATIEN
T_COMMENTS"."PAT_COMMENT_ID")
ORA-06512: at line 1

        at
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java


removing this line <param name="trigger" value="true" /> makes it hang.




[EMAIL PROTECTED] 04/05/05 05:05PM >>>

I'm sorry Eric, maybe my explanation has been a little to short.

The attribute SEQ_{0} is a placeholder that automaticaly replaces {0} with your table name. In your case you need to replace SEQ_{0} with the

name of the sequence you created on oracle or setup your sequence as follows:

CREATE SEQUENCE SEQ_WWW_PATIENT_COMMENTS MAXVALUE 2147483647
INCREMENT BY 1 START WITH 1
/
CREATE TRIGGER TRG_WWW_PATIENT_COMMENTS
BEFORE INSERT OR UPDATE ON WWW_PATIENT_COMMENTS
FOR EACH ROW
DECLARE
    iCounter WWW_PATIENT_COMMENTS.pat_comment_id%TYPE;
    cannot_change_counter EXCEPTION;
BEGIN
    IF INSERTING THEN
        Select SEQ_WWW_PATIENT_COMMENTS.NEXTVAL INTO iCounter FROM
Dual;
        :new.pat_comment_id := iCounter;
    END IF;

    IF UPDATING THEN
        IF NOT (:new.pat_comment_id = :old.pat_comment_id) THEN
            RAISE cannot_change_counter;
        END IF;
    END IF;

EXCEPTION
     WHEN cannot_change_counter THEN
         raise_application_error(-20000, 'Cannot Change Counter
Value');
END;
/

You also may have a look at:
http://castor.codehaus.org/key-generator.html


The VALUES (?,?,?,?,?,?) is correct as the ? will be replaced with the

values that need to be inserted into the database.

Ralf


Eric Anderson schrieb:


<key-generator name="SEQUENCE" alias="www_patient_comments_seq">
      <param name="sequence" value="SEQ_{0}" />
      <param name="returning" value="true" />
      <param name="trigger" value="true" />
  </key-generator>


and


System.out.println("Comment: "+cForm.getComment()+"
"+cForm.getPatientId()+" "+cForm.getPatCommentId());
create(cForm);

returns

Comment: test again jan4.05.test1 null
Apr 5, 2005 3:18:49 PM org.exolab.castor.jdo.engine.SQLEngine create
SEVERE: A fatal error occurred while creating
org.usiis.struts.CommentForm using
SQL: {call INSERT INTO "WWW_PATIENT_COMMENTS"
("USIIS_ID","PATIENT_ID","PROVIDE
R_ID","DATE_CREATED","PAT_COMMENT","SHARE_FLAG") VALUES (?,?,?,?,?,?)
RETURNING
"PAT_COMMENT_ID" INTO ?}
java.sql.SQLException: ORA-01400: cannot insert NULL into
("HL_AIMS"."WWW_PATIEN
T_COMMENTS"."PAT_COMMENT_ID")
ORA-06512: at line 1

      at
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java
:124)
      at
oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:304)
      at
oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:271)
      at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:622)
      at
oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.



Is the VALUES (?,?,?,?,?,?)  the problem? Although I don't know why
they would all be ?

thanks





[EMAIL PROTECTED] 04/05/05 03:10PM >>>



I use following key-generator definition with oracle.

  <key-generator name="SEQUENCE" alias="PCV">
      <param name="sequence" value="SEQ_{0}" />
      <param name="returning" value="true" />
      <param name="trigger" value="true" />
  </key-generator>

Could you try to add the trigger tag.

Ralf


Eric Anderson schrieb:




Yup it creats fine with an artifical key. So what could be wrong

with

this sequence...

Creates fine with a insert statement in oracle. I have checked
spelling.






[EMAIL PROTECTED] 04/05/05 12:15PM >>>





My first bet is something with the key-generator is screwy. Can you take that out and see if it will work correctly (just fake the key

on

one)? Everything else looks fine.

As far as the logging go, are you using Log4j at all? If so you can
set the default logging in the properties file to DEBUG for



org.exolab



and also change the property in the castor.properties file which is



in



the castor jar file. (forget which one, but its clearly commented)

On Apr 5, 2005 1:48 PM, Eric Anderson <[EMAIL PROTECTED]> wrote:





Seems as though I have another newbie problem

public void create(Object object) throws Exception {
 Database db = null;
 try {
   db = getDatabase();
   db.begin();
   db.create(object);
   db.commit();
 }
 catch (Exception e) {
   db.rollback();
   throw e;
 }
 finally {
   close(db);
 }
}

When I call create(cForm); the java process goes to 99% and hangs





until





I kill it. Is there some kind of logging I can turn on to see where





it





is hanging?
I am using castor-0.9.5.3.jar and classes12 from oracle 10g (thin
client)

Here is the mapping.

<key-generator name="SEQUENCE" alias="www_patient_comments_seq">
<param name="sequence" value="www_patient_comments_seq"/>
<param name="returning" value="true"/>
</key-generator>
<!-- comments area -->
<class name="org.usiis.struts.CommentForm" identity="patCommentId"
key-generator="www_patient_comments_seq">
<!--<cache-type type="unlimited"/>-->
<map-to table="WWW_PATIENT_COMMENTS"/>
<field name="patCommentId" type="integer"><sql
name="pat_comment_id" type="integer"/></field>
<field name="usiisId" type="string"><sql name="usiis_id"
type="integer"/></field>
<field name="patientId" type="string"><sql name="patient_id"
type="char"/></field>
<field name="providerId" type="string"><sql





name="provider_id"





type="char"/></field>
     <field name="date" type="date"><sql name="date_created"
type="date"/></field>
     <field name="comment" type="string"><sql name="pat_comment"
type="char"/></field>
     <field name="share" type="boolean"><sql name="share_flag"
type="char[NY]"/></field>
</class>







--

Syscon Ingenieurb�ro f�r
Me�- und Datentechnik GmbH
Ralf Joachim
Raiffeisenstra�e 11
D-72127 Kusterdingen
Germany

Tel.   +49 7071 3690 52
Mobil: +49 173 9630135
Fax    +49 7071 3690 98

Email: [EMAIL PROTECTED]
Web:   www.syscon-world.de

Reply via email to