我试图用ArrayList持久化对象(PERSON),但我得到了这个例子:
ERROR:2012-04-23 20:58:54,336 org.hibernate.property.BasicPropertyAccessor - IllegalArgumentException in class: Entities.Person, setter method of property: msgList
ERROR:2012-04-23 20:58:54,336 org.hibernate.property.BasicPropertyAccessor - expected type: java.util.ArrayList, actual value: org.hibernate.collection.PersistentList
人员类:
public class Person implements Serializable {
static final long serialVersionUID = 1L;
private long id;
private String _email;
private ArrayList<AnsMsg> msgList=new ArrayList<AnsMsg>();
long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getEmail() {
return _email;
}
public void set_email(String _email) {
this._email = _email;
}
public ArrayList<AnsMsg> getMsgList() {
return msgList;
}
public void setMsgList(ArrayList<AnsMsg> msgList) {
this.msgList = msgList;
}
}
Person Hbm:
<hibernate-mapping>
<class name="Entities.Person" table="PERSON">
<id name="id" type="long">
<column name="ID" />
<generator class="increment" />
</id>
<property name="_email" type="java.lang.String" access="field">
<column name="_EMAIL" />
</property>
<list name="msgList" cascade="all" >
<key column="parent_id"/>
<index column="idx" />
<one-to-many class="msg.AnsMsg" />
</list>
</class>
</hibernate-mapping>
现在我不想使用List
代替ArrayList
(private List<AnsMsg> msgList=new ArrayList<AnsMsg>();)
因为当我从DB Hibernate获取人员返回org.hibernate.collection.PersistentList
并且我需要序列化和反序列化此对象(Java服务器和android应用程序)并且“org.hibernate.collection.PersistentList”不实现Serializable(或我错了,因为当我尝试在android端反序列化时我得到null对象。)
这是我的Deserialize / Serialize方法:
public static byte[] serializeObject(Object o) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(o);
out.close();
byte[] buf = bos.toByteArray();
return buf;
}
catch(IOException ioe)
{
return null;
}
catch(Exception e)
{
return null;
}
}
public static Object deserializeObject(byte[] b) {
Object object=null;
try {
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(b));
object = in.readObject();
in.close();
return object;
} catch(ClassNotFoundException cnfe) {
return null;
} catch(IOException ioe) {
return null;
}
catch(Exception e)
{
String ex=e.toString();
return object;
}
}
更新
当我尝试使用List而不是ArrayList
时当我尝试在android端反序列化这个对象 (用“deserializeObject”方法)当我到达
object = in.readObject();
排队
java.lang.ClassNotFoundException: org.hibernate.collection.PersistentList.
这样我尝试使用ArrayList。
我该如何映射这个数组列表? 或者在这种情况下有一种与Hibernate一起使用的方式?
提前感谢..
答案 0 :(得分:2)
您正在使用ArrayList
这是List接口的实现,而hibernate正在返回PersistentList,这也是List接口的实现。因此,您不应该特定于ArrayList将您的ArrayList更改为java.util.List,以便它可以接受java.util.List的任何实现。它也将解决您的问题。
答案 1 :(得分:1)
您的POJO方法签名中的类型仍然是ArrayList,您需要将其更改为List everywhere
答案 2 :(得分:1)
恕我直言你的方向错了。 这些是你有的选择:
我会使用不同的序列化方法--JSON。有些图书馆使这个过程非常轻松。