package com.persia.entity; import javax.persistence.Embeddable; @Embeddable public class Name implements java.io.Serializable{ /** * */ private static final long serialVersionUID = -7695123567614604550L; /** * */ // private static final long serialVersionUID = 1L; private String first; private String last; public Name(){} public Name(String first,String last){ this.first=first; this.last=last; } public int hashcode(){ return (first+last).hashCode(); } public boolean equals(Object object){ if(this==object) return true; if(object==null) return false; if(!(object instanceof Name)) return false; Name name=(Name)object; if((name.first.equals(first))&& (name.last.equals(last))) return true; else return false; } public String getFirst() { return first; } public void setFirst(String first) { this.first = first; } public String getLast() { return last; } public void setLast(String last) { this.last = last; } }
学生:
package com.persia.entity; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.Table; @Entity @Table(name="student") public class Student implements java.io.Serializable{ /** * */ private static final long serialVersionUID = 5609072904523058853L; /** * */ //private static final long serialVersionUID = 1L; private Name name; private String grade; private String email; public Student(){} public Student(Name name,String grade,String email){ super(); this.name=name; this.grade=grade; this.email=email; } @EmbeddedId public Name getName() { return name; } public void setName(Name name) { this.name = name; } public String getGrade() { return grade; } public void setGrade(String grade) { this.grade = grade; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
DAO:
package com.persia.entity; import java.util.List; import javax.ejb.Remote; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; @Stateless @Remote({StudentDAO.class}) public class StudentDAOBean implements StudentDAO { @PersistenceContext protected EntityManager em; @Override public void create(String first, String last, String grade, String email) { Student stu=new Student(); stu.setName(new Name(first,last)); stu.setGrade(grade); stu.setEmail(email); em.persist(stu); } @Override public Student find(Name name) { Student s=em.find(Student.class, name); System.out.println("find的是否为空???"+(s==null)); return s; } @Override public List findByFirstName(String name) { return em.createQuery("from student s where s.name.first=:name").setParameter("name", name).getResultList(); } @Override public List findByLastName(String name) { return em.createQuery("from student s where s.name.last=:name").setParameter("name", name).getResultList(); } }
测试:
package com.persia.ejb; import java.util.Properties; import javax.naming.InitialContext; import javax.naming.NamingException; import com.persia.entity.Student; import com.persia.entity.StudentDAO; public class Test { /** * @param args * @throws NamingException */ public static void main(String[] args) throws NamingException { Properties props=new Properties(); props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory"); props.setProperty("java.naming.provider.url","localhost:1099"); props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming"); InitialContext ctx=new InitialContext(props); try{ StudentDAO dao=(StudentDAO)ctx.lookup("StudentDAOBean/remote"); dao.create("ma","xiaolong","8","maxiaolong@163.com"); dao.create("ma","dalong","8","madalong@163.com"); com.persia.entity.Name n=new com.persia.entity.Name("ma","xiaolong"); Student s=dao.find(n); System.out.println("is s null???"+(s==null)); System.out.println(s.getName().getFirst()+" "+s.getName().getLast()+" "+s.getEmail()); }catch(Exception e){ e.printStackTrace(); } } }
问题:
可以正常插入,但到查询的时候,出现问题:
java.lang.reflect.UndeclaredThrowableException at $Proxy0.find(Unknown Source) at com.persia.ejb.Test.main(Test.java:29) Caused by: java.rmi.MarshalException: Failed to communicate. Problem during marshalling/unmarshalling; nested exception is: java.io.InvalidClassException: com.persia.entity.Student; com.persia.entity.Student; class invalid for deserialization at org.jboss.remoting.transport.socket.SocketClientInvoker.handleException(SocketClientInvoker.java:122) at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.transport(MicroSocketClientInvoker.java:646) at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:122) at org.jboss.remoting.Client.invoke(Client.java:1634) at org.jboss.remoting.Client.invoke(Client.java:548) at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:62) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:67) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:53) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:74) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:107) ... 2 more Caused by: java.io.InvalidClassException: com.persia.entity.Student; com.persia.entity.Student; class invalid for deserialization at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:713) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1733) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at org.jboss.aop.joinpoint.InvocationResponse.readExternal(InvocationResponse.java:122) at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1792) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1751) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.receiveObjectVersion2_2(JavaSerializationManager.java:239) at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.receiveObject(JavaSerializationManager.java:133) at org.jboss.remoting.marshal.serializable.SerializableUnMarshaller.read(SerializableUnMarshaller.java:120) at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.versionedRead(MicroSocketClientInvoker.java:957) at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.transport(MicroSocketClientInvoker.java:586) at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:122) at org.jboss.remoting.Client.invoke(Client.java:1634) at org.jboss.remoting.Client.invoke(Client.java:548) at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:62) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:67) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:53) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:74) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:107) at $Proxy0.find(Unknown Source) at com.persia.ejb.Test.main(Test.java:29) at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:74) ... 10 more Caused by: java.io.InvalidClassException: com.persia.entity.Student; class invalid for deserialization at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:587) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at org.jboss.aop.joinpoint.InvocationResponse.readExternal(InvocationResponse.java:122) at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1792) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1751) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.receiveObjectVersion2_2(JavaSerializationManager.java:239) at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.receiveObject(JavaSerializationManager.java:133) at org.jboss.remoting.marshal.serializable.SerializableUnMarshaller.read(SerializableUnMarshaller.java:120) at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.versionedRead(MicroSocketClientInvoker.java:957) at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.transport(MicroSocketClientInvoker.java:586) at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:122) at org.jboss.remoting.Client.invoke(Client.java:1634) at org.jboss.remoting.Client.invoke(Client.java:548) at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:62) ... 10 more