NotSerializableException
okism Jan 23, 2006 7:22 PMCan someone tell me why this code throws NotSerializableException:
package com.gint.scm.ejb.entity;
import java.io.Serializable;
import java.util.Collection;
import javax.ejb.Local;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratorType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@SuppressWarnings("serial")
@Entity
@Local
@Table(name = "application")
public class Application implements Serializable{
 private long id;
 private String name;
 private Collection<Version> versions;
 public Application() {
 }
 public Application(String name) {
 this.name = name;
 }
 @Id(generate=GeneratorType.AUTO)
 public long getId() {
 return id;
 }
 public void setId(long id) {
 this.id = id;
 }
 @Column(name="name")
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 @OneToMany
 public Collection<Version> getVersions() {
 return versions;
 }
 public void setVersions(Collection<Version> versions) {
 this.versions = versions;
 }
}
package com.gint.scm.ejb.entity;
import javax.ejb.Local;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@SuppressWarnings("serial")
@Entity
@Local
@Table(name = "version")
public class Version {
 String versionMark;
 Application application;
 VersionPK versionPK;
 @EmbeddedId
 @AttributeOverrides({
 @AttributeOverride(name="versionMark",column = @Column(name="versionMark")),
 @AttributeOverride(name="applicationId",column = @Column(name="applicationId"))
 })
 public VersionPK getVersionPK() {
 return versionPK;
 }
 public void setVersionPK(VersionPK versionPK) {
 this.versionPK = versionPK;
 }
 @ManyToOne
 @JoinColumn(name="applicationId",insertable=false,updatable=false)
 public Application getApplication() {
 return application;
 }
 public void setApplication(Application application){
 this.application = application;
 }
}package com.gint.scm.ejb.entity;
import java.io.Serializable;
@SuppressWarnings("serial")
public class VersionPK implements Serializable {
 private String versionMark;
 private long applicationId;
 public VersionPK() {
 }
 public VersionPK(String versionMark, long applicationId) {
 this.versionMark = versionMark;
 this.applicationId = applicationId;
 }
 public long getApplicationId() {
 return applicationId;
 }
 public void setApplicationId(long applicationId) {
 this.applicationId = applicationId;
 }
 public String getVersionMark() {
 return versionMark;
 }
 public void setVersionMark(String versionMark) {
 this.versionMark = versionMark;
 }
 public int hashCode() {
 return (int) versionMark.hashCode()
 + (int) (new Long(applicationId)).hashCode();
 }
 public boolean equals(Object obj) {
 if (obj == this)
 return true;
 if (!(obj instanceof VersionPK))
 return false;
 if (obj == null)
 return false;
 VersionPK pk = (VersionPK) obj;
 return pk.versionMark.equals(versionMark)
 && pk.applicationId == applicationId;
 }
}
Creating works fine for both entities, find (by primary key) works also. The problem is if I perform find for Version entity and try to pass it to remote client.
NotSerializableException for Version entity.
I must say that everything works fine within container - find returns Version entity to the stateless session bean that is used as the facade. Exception is trown if Version entity is passed to the remote client from the facade.
 
    