XMLEncoder stops serializing at PersistentBag collection
forumer Feb 5, 2007 10:45 AMI have this class which is a composite of other classes. One of the composite, Role is itself a composite of class, Recipient. But the XMLEncoder stops at Role designating it as PersistentBag. Apparently, XMLEncoder doesn't go any further because it is not a bean.
Has anybody developed a persistentDelegate to deal with PersistentDelegate and "unravel" XML all the way to the edge of the object graph?
Thanks in Advance.
Here is the "central" class:
public class ServiceNotification implements Serializable
{
private long id;
private List<Role> roles;
private Application application;
private Event event;
private String name;
public ServiceNotification(){}
public ServiceNotification(Application app, Event event, String name)
{
this.application = app;
this.event = event;
this.name = name;
}
@Id
@GeneratedValue
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
@OneToOne(fetch = FetchType.EAGER, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
public Application getApplication()
{
return application;
}
public void setApplication(Application application)
{
this.application = application;
}
@OneToOne(fetch = FetchType.EAGER, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
public Event getEvent()
{
return event;
}
public void setEvent(Event event)
{
this.event = event;
}
@OneToMany(fetch = FetchType.EAGER, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
public List<Role> getRoles()
{
return roles;
}
public void setRoles(List<Role> roles)
{
this.roles = roles;
}
Role contains recipients
public class Role implements Serializable
{
private long id;
private String name;
private List<Recipient> recipients = new ArrayList<Recipient>();
public Role(){}
public Role(long id){this.id = id;}
public Role(String name){this.name = name;}
@Id
@GeneratedValue
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
/**
* @return Returns the role_name.
*/
public String getName()
{
return name;
}
/**
* @return Returns the recipients.
*/
@ManyToMany(fetch = FetchType.EAGER, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@JoinTable
(
name="ROLE_RECIPIENT",
joinColumns=@JoinColumn(name="ROLE_ID", referencedColumnName="ID"),
inverseJoinColumns=@JoinColumn(name="RECIPIENT_ID", referencedColumnName="ID")
)
public List<Recipient> getRecipients()
{
return recipients;
}
/**
* @param recipients The recipients to set.
*/
public void setRecipients(List<Recipient> recipients)
{
this.recipients = recipients;
}
/**
* @param role_name The role_name to set.
*/
public void setRole_name(String name)
{
this.name = name;
}
public void setName(String name)
{
this.name = name;
}
The XML output is:
<?xml version="1.0" encoding="UTF-8"?> <java version="1.5.0_06" class="java.beans.XMLDecoder"> <object class="java.util.ArrayList"> <void method="add"> <object id="ServiceNotification0" class="examplen.ServiceNotification"> <void property="application"> <object class="examplen.Application"> <void property="id"> <long>1</long> </void> <void property="name"> <string>FLEET_MANAGER</string> </void> </object> </void> <void property="event"> <object class="examplen.Event"> <void property="action"> <string>TO BE DETERMINED</string> </void> <void property="description"> <string>An airplane in the database has been changed</string> </void> <void property="id"> <long>1</long> </void> <void property="type"> <string>AIRPLANE_CHANGE</string> </void> </object> </void> <void property="id"> <long>1</long> </void> <void property="roles"> <object class="org.hibernate.collection.PersistentBag"> <void property="owner"> <object idref="ServiceNotification0"/> </void> </object> </void> </object> </void> </object> </java>