Hi Iris,
I implemented your test and run against latest from SVN (OJB_1_0_RELEASE
branch, upcoming OJB 1.0.5).
The test can be found here:
http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/OneToOneWithoutFKTest.java?view=markup
The mapping here (end of file):
http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/repository_junit_reference.xml?view=markup
When using proxied references I can reproduce your NPE. The reason for
the NPE I described in my previous post:
<snip>
In your mapping you don't use separate FK for the 1:1 references. This
could cause unexpected behavior when using proxy references. Assume you
are nullify the Passport of a Person. Next time you materialize the
Person object OJB tries to resolve the reference to Passport by lookup
the FK defined in Person. You define the Person PK as FK for Passport
reference (the FK to Passport could never be nullified), thus OJB assume
that the reference to Passport still exists and create a proxy reference
(instead of setting null). If you now try to access the Passport
reference in Person you will get a NPE, because OJB can't find the
Passport object.
</snip>
I don't know how we can prevent the proxy object creation without
database access (this will kill performance). Currently I fixed it by
returning 'null' for all proxied methods of the "not existing reference".
regards,
Armin
Iris Soto wrote:
Armin Waibel escribió:
Iris Soto wrote:
Hello Armin, thanks for ask me,
the version of OJB that i'm using is y.IndirectionHandler -1.0.4, in
the OJB.properties file i have enable CGLib proxy support. I has
been try test pass without using proxied references, and there is
nothing different, the error is the same. I want to make
bidirectional reference even though the passport is null when make
reference in person
to passport. OJB can work with this null reference?
I currently try to write a test to reproduce your problem. Could you
post some example/pseudo code to reproduce your problem?
regards,
Armin
Now I have:
****************************************************************
<class-descriptor class="org.apache.ojb.Person" table="PERSON">
<field-descriptor name="personId" primarykey="true"
nullable="false" autoincrement="true"... column="PERSON_ID"
jdbc-type="INTEGER"/>
<field-descriptor name="personName" nullable="false"
default-fetch="true" column="PERSON_NAME" jdbc-type="VARCHAR"/>
<reference-descriptor name="personIdRef"
class-ref="org.apache.ojb.Passport" auto-update="true"
auto-delete="true">
<foreignkey field-ref="personId"/>
</reference-descriptor>
</class-descriptor>
****************************************************************
<class-descriptor class="org.apache.ojb.Passport" table="PASSPORT">
<field-descriptor name="personId" primarykey="true"
nullable="false" column="PERSON_ID" jdbc-type="INTEGER"/>
<field-descriptor name="passport_number" nullable="false"
default-fetch="true" column="PASSPORT_NUMBER" jdbc-type="VARCHAR"/>
<reference-descriptor name="personIdRef"
class-ref="org.apache.ojb.Person" auto-update="false"
auto-delete="false">
<foreignkey field-ref="personId"/>
</reference-descriptor>
</class-descriptor>
--
Iris Soto
---------------------------------------------------------------------
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 begin i need to store the person, in the test file:
-------------------------------------------------------------------------------------------------------
public class TestPerson extends PBTestBase {
private PersonHandler personHandler;
public void setUp() throws Exception {
super.setUp(); personHandler = new
PersonHandler(); }
public void testInsertRetrieveBroker() throws Exception {
PersonHandler personHandler = new PersonHandler();
Person person = new Person();
person.setPersonName("Name 1");
// Save to bean
personHandler.insert(person);
// Retrieve the bean
Person personRetrieve =
PersonHandler.retrieve(person.getPersonId());
// Remove the bean
personHandler.remove(personRetrieve.getPersonId()); // Here I
got the error.
}
protected void cleanUpDB() throws Exception {
removeAll(Person.class);
}
}
----------------------------------------------------------------------------------------------------------
I insert my bean call to file PersonHandler.java that contains the
following:
import org.apache.ojb.Person;
import org.apache.ojb.Passport;
public class PersonHandler {
/********************/
public void insert(Person bean) throws Exception {
PersistenceBroker broker = null;
try {
broker = PersistenceBrokerFactory.defaultPersistenceBroker();
broker.beginTransaction();
broker.store(bean);
broker.commitTransaction();
} catch (Exception e) {
throw e;
} finally {
if (broker != null && !broker.isClosed()) {
if (broker.isInTransaction()) {
broker.abortTransaction();
}
broker.close();
}
/********************/
public void update(Person bean) throws Exception {
PersistenceBroker broker = null;
try {
broker = PersistenceBrokerFactory.defaultPersistenceBroker();
broker.beginTransaction();
broker.store(bean);
broker.commitTransaction();
broker.clearCache();
} catch (Exception e) {
throw e;
} finally {
if (broker != null && !broker.isClosed()) {
if (broker.isInTransaction()) {
broker.abortTransaction();
}
broker.close();
}
}
}
/**********************************/
public void remove(Integer personId) throws Exception {
PersistenceBroker broker = null;
try {
broker = PersistenceBrokerFactory.defaultPersistenceBroker();
broker.beginTransaction();
Person bean = retrieve(personId, broker);
broker.delete(bean);
broker.commitTransaction();
broker.clearCache();
} catch (Exception e) {
throw e;
} finally {
if (broker != null && !broker.isClosed()) {
if (broker.isInTransaction()) {
broker.abortTransaction();
}
broker.close();
}
}
}
/****************************/
public static Person retrieve(Integer personId, PersistenceBroker
broker) {
Person criterio = new Person();
criterio.setPersonId(personId);
Query query = new QueryByIdentity(criterio);
return (Person) broker.getObjectByQuery(query);
}
}
**************************************************************
Passport.java
---------------------------------
public class Passport implements java.io.Serializable
{
private Integer personId;
private Integer passportNumber;
public Integer getPersonId() { return personId; }
public void setPersonId(Integer personId)
{
this.personId = personId;
}
//---------------------------------------------------------------------------
public Integer getPassportNumber() { return passportNumber; }
public void setPassportNumber(Integer passportNumber)
{
this.passportNumber = passportNumber;
}
//---------------------------------------------------------------------------
private Person PersonIdRef;
public Person getPersonIdRef() { return personIdRef; }
public void setPersonIdRef(Persons person)
{
this.personIdRef = person;
}
}
*******************************************
Person.java
-----------------------------
public class Person implements java.io.Serializable
{
public Integer getPersonId() { return PersonId; }
public void setPersonId(Integer PersonId)
{
this.PersonId = PersonId;
}
//---------------------------------------------------------------------------
public String getPersonName() { return personName; }
public void setPersonName(String personName)
{
this.personName = personName;
}
//---------------------------------------------------------------------------
private Passport personIdRef;
public Passport getPersonIdRef() { return personIdRef; }
public void setPersonIdRef(Passport passport)
{
this.personIdRef = passport;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]