Hi Jean-Yves,
jys wrote:
I'am getting trouble retrieving an instance of a class representing a
tree structure with ojb (last release), in the database the record is
good :
parentid id
name description
hJ}Tfk7o>#S[Om?\AP:X}T1y hJ}Tfk7o>#S[Om?\AP:X}T1y terre
<NULL> hJ}Tfk7o>#S[Om?\AP:X}T1y OK?`L_igc>JlU:m66mH^",@:
france <NULL> OK?`L_igc>JlU:m66mH^",@:
(ZjHVf">aQvtj%6H)$NC$7hl paris <NULL>
(ZjHVf">aQvtj%6H)$NC$7hl )f[u|G'za6-&!P]OUlp-=z>n toureiffel
<NULL> (ZjHVf">aQvtj%6H)$NC$7hl Wz:YyW,[EMAIL PROTECTED];A bnf
<NULL> Wz:YyW,[EMAIL PROTECTED];A BWZ[_/i>Oq{Kj48VXBPOe.~&
salle1 <NULL>
So OJB was able to persists it right.
But whem i'am trying to retrieve the structure, it's kind of messed up,
as "terre" wich is the root of the tree is the child of itself, like that :
terre
terre france
......
Could you describe what's going wrong, does OJB throw an exception or do
you get a StackOverflowError?
I assume it can result in a StackOverflowError, because by default the
retrieve of the 1:1 reference is enabled and the 'root' object lookup
it's parent --> root, this itself will lookup the parent --> root ...
Could this be the problem?
I did a test with latest from CVS (OJB_1_0_RELEASE branch) setting a
object as parent object of itself. This test pass.
I don't know what i'am doing bad, but i tried to secure my getter and
setters so it's not possible to add a child which is the same object.
I was surprised to not get an exception, so i tried to add breakpoints
to all my getters and setters to see when OJB is calling them, but
it never stop at my breakpoints. So how does OJB set the attributes of
the instances (my instances attributes are private) ? i really don't get
it.
This depends on the 'PersistentFieldClass' setting in OJB.properties
file. Per default OJB directly set the attributes of your persistent
objects.
http://db.apache.org/ojb/docu/guides/advanced-technique.html#Change+PersistentField+Class
> It's another unrelated question but i always get this error when
> starting my tests : is it normal ?
>
> org.apache.ojb.broker.platforms.PlatformPostgresImpl
> java.lang.ClassNotFoundException:
> org.apache.ojb.broker.platforms.PlatformPostgresImpl
> at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
> at java.security.AccessController.doPrivileged(Native Method)
> at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
> at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
> at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
> at java.lang.Class.forName0(Native Method)
> at java.lang.Class.forName(Class.java:242)
> at org.apache.ojb.broker.util.ClassHelper.getClass(Unknown Source)
> at org.apache.ojb.broker.util.ClassHelper.getClass(Unknown Source)
> at
> org.apache.ojb.broker.platforms.PlatformFactory.getPlatformFor(Unknown
Seems you specify a wrong 'platform' name in your jdbc-connection-descriptor
> org.apache.ojb.broker.platforms.PlatformPostgresImpl
admittedly this class doesn't exist in OJB (the correct name is
PlatformPostgreSQLImpl). How did you set the platform attribute? The
allowed settings can be found here:
http://db.apache.org/ojb/docu/guides/repository.html#Attributes-N1013A
Example:
<jdbc-connection-descriptor
jcd-alias="default"
default-connection="true"
platform="PostgreSQL"
jdbc-level="2.0"
...
regards,
Armin
Thank you.
Jean-Yves
Here is the code of my class if someone can understand the problem :
/*
* Created on 6 déc. 2004
*
*/
package org.jys.jphotowiki.data.locate;
import java.io.Serializable;
import java.util.List;
import java.util.Vector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jys.jphotowiki.data.DataIntegrityException;
import org.jys.jphotowiki.data.IDataObject;
import org.jys.jphotowiki.test.pers.TestBaseCreation;
/**
* Class representing some location, has a parent and some childs of same
type
* to make a tree of locations. Location with itself has parent is the root
* location (ancestor of all other locations within the context of an
* [EMAIL PROTECTED] org.jys.jphotowiki.data.DocumentBase}, a location with no child
is a
* leaf of the location tree.
* * @ojb.class
* @ojb.field name="parentId" jdbc-type="VARCHAR" nullable="false"
* @author jysu_cb
*/
public class Location implements IDataObject, Serializable {
protected Log _log = LogFactory.getLog(Location.class);
/**
* Comment for <code>serialVersionUID</code>
*/
private static final long serialVersionUID = 6009335074727417445L;
/**
* internal id
* * @ojb.field primarykey="true"
*/
private String id;
/**
* name
* * @ojb.field
*/
private String name;
/**
* description
* * @ojb.field length="200"
*/
private String description;
/**
* parent location
* * @ojb.reference foreignkey="parentId" auto-update="none"
* auto-delete="none"
*/
private Location parent;
/**
* @ojb.collection
element-class-ref="org.jys.jphotowiki.data.locate.Location"
* foreignkey="parentId"
*/
private List<Location> childs = new Vector<Location>();
public void addChild(Location newChild) {
if (!newChild.isNew()) {
throw new IllegalArgumentException("Can only insert a new
Location");
}
childs.add(newChild);
newChild.setParent(this);
}
public int size() {
int result = 1;
for (Location child : getChilds()) {
result += child.size();
}
return result;
}
/**
* @return Returns the childs.
*/
public List<Location> getChilds() {
return childs;
}
/**
* @param childs
* The childs to set.
*/
public void setChilds(List<Location> childs) {
_log.debug("Setting childs : " + childs);
if (childs.contains(this)) {
throw new IllegalArgumentException("One of my son is myself");
}
this.childs = childs;
}
/**
* @return Returns the id.
*/
public String getId() {
return id;
}
/**
* @param id
* The id to set.
*/
public void setId(String id) {
this.id = id;
}
/**
* @return Returns the description.
*/
public String getDescription() {
return description;
}
/**
* @param description
* The description to set.
*/
public void setDescription(String description) {
this.description = description;
}
/**
* @return Returns the name.
*/
public String getName() {
return name;
}
/**
* @param name
* The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* @return Returns the parent.
*/
public Location getParent() {
return parent;
}
/**
* @param parent
* The parent to set.
*/
private void setParent(Location parent) {
if (parent.equals(this)
|| (findDescendant(parent.getId()) != null)) {
throw new IllegalArgumentException("Could not set self or
child has parent");
}
this.parent = parent;
}
public boolean isAncestor(Location l) {
for (Location child : getChilds()) {
if (child.equals(l) || child.isAncestor(l)) {
return true;
}
}
return false;
}
public Location findDescendant(String descendantId) {
//FIXME ca boucle
if (descendantId.equals(this.getId())) {
return this;
}
for (Location child : getChilds()) {
if (descendantId.equals(child.getId())) {
return child;
}
Location back = child.findDescendant(descendantId);
if (back != null) {
return back;
}
}
return null;
}
public void insertParent(Location l) {
if (!l.isNew()) {
throw new IllegalArgumentException("Can only insert a new
Location");
}
this.getParent().addChild(l);
this.getParent().removeChild(this);
l.childs.add(this);
}
private void removeChild(Location location) {
this.getChilds().remove(location);
}
private boolean isNew() {
return childs.isEmpty() && getParent() == null && getId() == null;
}
public void remove() throws DataIntegrityException {
if (isRoot()) {
throw new DataIntegrityException("Can not delete root
location");
}
for (Location child : getChilds()) {
getParent().getChilds().add(child);
}
getParent().getChilds().remove(this);
}
public boolean isLeaf() {
return getChilds().isEmpty();
}
public boolean isRoot() {
return this.equals(getParent());
}
public boolean equals(Object object) {
if (!(object instanceof Location)) {
return false;
}
Location rhs = (Location) object;
return this.id.equals(rhs.getId());
}
public String toString() {
return this.getId() + "@" + this.getName();
}
public int hashCode() {
return getId().hashCode();
}
public Location(String name, String description, Location parent) {
super();
this.name = name;
this.description = description;
this.parent = parent;
}
public Location() {
super();
}
public Location(String name, Location parent) {
super();
this.name = name;
parent.addChild(this);
}
public void setRoot() {
if (this.parent != null) {
throw new IllegalStateException(
"Could not set root, because already has parent");
}
this.parent = this;
}
public List<Location> getAll() {
List<Location> back = new Vector<Location>();
back.add(this);
for (Location child : getChilds()) {
back.addAll(child.getAll());
}
return back;
}
}
It's another unrelated question but i always get this error when
starting my tests : is it normal ?
org.apache.ojb.broker.platforms.PlatformPostgresImpl
java.lang.ClassNotFoundException:
org.apache.ojb.broker.platforms.PlatformPostgresImpl
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:242)
at org.apache.ojb.broker.util.ClassHelper.getClass(Unknown Source)
at org.apache.ojb.broker.util.ClassHelper.getClass(Unknown Source)
at
org.apache.ojb.broker.platforms.PlatformFactory.getPlatformFor(Unknown
Source)
at
org.apache.ojb.broker.accesslayer.ConnectionManagerImpl.<init>(Unknown
Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
---------------------------------------------------------------------
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]