i made some test wit references:
Person has a reference to Test. first i connect the Test from person1 to person2, then i add a new Test to person2.
this works when i set auto-update="true" in the reference-descriptor !
private void updateRef(PersistenceBroker broker)
{
Query query;
Criteria crit;
IPerson person1, person2;
ITest testObj = null; crit = new Criteria();
crit.addEqualTo("id", new Integer(1));
query = new QueryByCriteria(Person.class, crit);
person1 = (IPerson) broker.getObjectByQuery(query);
testObj = person1.getTestObject(); crit = new Criteria();
crit.addEqualTo("id", new Integer(3));
query = new QueryByCriteria(Person.class, crit);
person2 = (IPerson) broker.getObjectByQuery(query); // connect existing TestObj of person1
person2.setTestObject(testObj);
broker.store(person2);
broker.clearCache(); crit = new Criteria();
crit.addEqualTo("id", new Integer(3));
query = new QueryByCriteria(Person.class, crit);
person2 = (IPerson) broker.getObjectByQuery(query);testObj = person2.getTestObject();
// connect to a new TestObj
Test testObj1 = new Test();
testObj1.setId(new Integer(77));
testObj1.setTest("New TestObj 77");
person2.setTestObject(testObj1);
broker.store(person2);
-----
<class-descriptor
class="brj.ojb.Person"
table="tabPerson"
>
...
<field-descriptor
name="idTest"
column="idTest"
jdbc-type="INTEGER"
/>
....
<reference-descriptor
name="testObject"
class-ref="brj.ojb.Test"
proxy="false"
auto-update="true"
>
<foreignkey field-ref="idTest"/>
</reference-descriptor>
.... <class-descriptor
class="brj.ojb.Test"
table="tabTest"
>
<field-descriptor id="1"
name="id"
column="id"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="true"
/>
<field-descriptor id="2"
name="test"
column="test"
jdbc-type="VARCHAR"
/></class-descriptor>
hth jakob
Jason McKerr wrote:
OK, I've done some more testing. Basically I'm finding that
a) If the foreign key datatype is a primitive (int) it works fine, but you can't null it
OR
b) If it's not a primitive, the reference (reference-descriptor) object MUST exist and be set for the foreign-key to persist. That means I have two choices:
1) Switch to primitives
2) do runtime checks. As in, if (fkID != null) {
Object a = new Object();
a.setPK(fkID);
}
broker.store(this);
Included is the Java file (attached) and the snippet from my repository.xml.
Thanks,
Jason
----------------Snippet----------------------------------
<!-- Definitions for org.nacse.nees.data.project.Acknowledgement --> <class-descriptor class="org.nacse.nees.data.project.Acknowledgement" table="ACKNOWLEDGEMENT"> <field-descriptor name="ackID" column="ACKID" jdbc-type="INTEGER" primarykey="true" autoincrement="true" sequence-name="ackSeq"/> <field-descriptor name="projectID" column="PROJECTID" jdbc-type="INTEGER" conversion="org.apache.ojb.broker.accesslayer.conversions.Int2IntegerFieldConversion"/> <field-descriptor name="acknowledgements" column="ACKNOWLEDGEMENTS" jdbc-type="VARCHAR"/> <field-descriptor name="sponsors" column="SPONSORS" jdbc-type="VARCHAR"/> <field-descriptor name="ackOptLock" column="ACKOPTLOCK" jdbc-type="INTEGER" locking="true"/> <reference-descriptor name="projectRef" class-ref="org.nacse.nees.data.project.Project" auto-retrieve="false" auto-update="false" auto-delete="false"> <foreignkey field-ref="projectID"/> </reference-descriptor> </class-descriptor>
On Wed, 2003-06-25 at 10:11, Jakob Braeuchi wrote:
hi jason,
i'd prefer the wrappers. primitives are bad. could you please provide your class and repository.
jakob
Jason McKerr wrote:
---------------------------------------------------------------------OK, looking at the repository.dtd file, it seems that reference descriptors cannot be a wrapper datatype (Integer). It must be primitive. Does that mean I can't have a nullable foreign key? I know that's unusual, but it's not that unusual.
Switching to an int made it work, but now it's required. Is there a way around this? Using a conversion?
Jason
On Wed, 2003-06-25 at 09:20, Jason McKerr wrote:
Hey guys,
I'm having a problem with a nullable foreign-key column not getting updated.
I've got a table (Acknowledgements) that has a foreign key to the
Project table.
Now if I have all of the columns set for acknowledgements (including projectID) all of the columns except projectID are getting set when I call store(). The projectID is getting set to null.
If I comment out the reference call to Project from the Acknowledgement table in my repository, the column gets set normally.
So the question is: Can I not just do an insert without a complete object reference? I'm doing a lot of this over serialized XML so it's not cool to have to pass an object graph just to do an isnert on a minor related table.
Jason
---------------------------------------------------------------------
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]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
------------------------------------------------------------------------
package org.nacse.nees.data.project ;
import org.apache.ojb.broker.query.Query; import org.apache.ojb.broker.query.QueryByCriteria; import org.apache.ojb.broker.PersistenceBroker; import org.apache.log4j.Logger; import org.nacse.nees.data.DataObjectPBroker;
import java.util.Collection; import java.io.Serializable;
public class Acknowledgement extends DataObjectPBroker implements Serializable {
private Integer ackID; private Integer projectID; private String acknowledgements; private String sponsors; private Project projectRef; private Integer ackOptLock;
static Logger log = Logger.getLogger(Acknowledgement.class);
public Acknowledgement() { } public Acknowledgement(Integer ackID, Integer projectID, String acknowledgements, String sponsors) { this.ackID = ackID; this.projectID = projectID; this.acknowledgements = acknowledgements; this.sponsors = sponsors; }
public Integer getAckID() { return ackID; } public void setAckID(Integer ackID) { this.ackID = ackID; } public Integer getProjectID() { return projectID; } public void setProjectID(Integer projectID) { this.projectID = projectID; } public String getAcknowledgements() { return acknowledgements; } public void setAcknowledgements(String acknowledgements) { this.acknowledgements = acknowledgements; } public String getSponsors() { return sponsors; } public void setSponsors(String sponsors) { this.sponsors = sponsors; } public Project getProjectRef() { return projectRef; } public void setProjectRef(Project projectRef) { this.projectRef = projectRef; } public Integer getAckOptLock() { return ackOptLock; } public void setAckOptLock(Integer ackOptLock) { this.ackOptLock = ackOptLock; }
public Collection listAllAcks() throws Exception { Query query = new QueryByCriteria(Acknowledgement.class, null); PersistenceBroker broker = super.getDefaultBroker(); try { return broker.getCollectionByQuery(query); } catch (Exception e) { log.error("Exception in listAllAcks(): ", e); throw new Exception("Exception in listAllAcks(): ", e); } finally { broker.close(); } }
public void addAck() throws Exception { PersistenceBroker broker = super.getDefaultBroker(); try { broker.beginTransaction(); broker.store(this); broker.commitTransaction(); } catch (Exception e) { broker.abortTransaction(); log.error("Exception in addAck(): ", e); throw new Exception("Exception in addAck(): ", e); } finally { broker.close(); } }
public Acknowledgement selectAck() throws Exception { Query query = new QueryByCriteria(this); PersistenceBroker broker = super.getDefaultBroker(); try { Acknowledgement ack = (Acknowledgement)broker.getObjectByQuery(query); return ack; } catch (Exception e) { log.error("Exception in selectAck(): ", e); throw new Exception("Exception in selectAck(): ", e); } finally { broker.close(); } }
public void editAck() throws Exception { PersistenceBroker broker = super.getDefaultBroker(); try { broker.beginTransaction(); broker.store(this); broker.commitTransaction(); } catch (Exception e) { broker.abortTransaction(); log.error("Exception in editAck(): ", e); throw new Exception("Exception in editAck(): ", e); } finally { broker.close(); } }
public void removeAck() throws Exception { PersistenceBroker broker = super.getDefaultBroker(); try { broker.beginTransaction(); broker.delete(this); broker.commitTransaction(); } catch (Exception e) { broker.abortTransaction(); log.error("Exception in removeAck(): ", e); throw new Exception("Exception in removeAck(): ", e); } finally { broker.close(); } } }
------------------------------------------------------------------------
--------------------------------------------------------------------- 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]
