0

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;
}
}

人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を実装していません(またはnullを取得するため間違っています) Android側で逆シリアル化しようとするとオブジェクト)。

これは私の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; 
        }
      }

アップデート:

ArrayListの代わりにListを使おうとすると

Android側でこのオブジェクトを(「deserializeObject」メソッドを使用して)逆シリアル化しようとすると、

object = in.readObject(); 

投げるライン

java.lang.ClassNotFoundException: org.hibernate.collection.PersistentList. 

このように私はArrayListを使おうとします。

この配列リストをマップするにはどうすればよいですか?または、この場合、Hibernateを操作するためのより良い方法がありますか?

前もって感謝します..

4

3 に答える 3

2

List インターフェイスの実装であるを使用して ArrayListおり、hibernate は List インターフェイスの実装でもあるPersistentListを返しています。したがって、ArrayList に固有である必要はありません。ArrayList を java.util.List に変更して、java.util.List の任意の実装を受け入れることができるようにします。それはまたあなたの問題を解決します。

于 2012-04-23T18:48:55.453 に答える
1

私見あなたは間違った方向に進んでいます。これらはあなたが持っているオプションです:

  • エンティティを POJO にコピーし、Android デバイスに送信します。(無効)
  • hibernate をライブラリとして Android アプリに追加します。これはアンドロイドには多すぎます。(あなたのAndroidアプリを膨らませます)
  • さまざまなシリアライゼーション手段 (JSON、XML) を使用する

シリアル化のさまざまな手段、つまり JSON を使用します。プロセスを非常に簡単にするライブラリがあります。

于 2012-04-23T21:20:44.897 に答える
1

POJO メソッド署名の型はまだ ArrayList です。どこでも List に変更する必要があります

于 2012-04-23T18:34:01.677 に答える