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.