2

次のコードを実行して、CSV ファイルから読み取ったデータに従ってデータベースを更新しています。コンソールをデバッグして確認しようとしましたが、800 レコード全体を実行しています。エラーは発生しませんが、最初のレコードのみが挿入されます。マージの代わりに永続化を使用している場合、「デタッチされたオブジェクトを永続化できません」というエラーが発生しました。

        for (String[] data : dataList) {
            log.debug("Reading data no " + (i++));
            EntityManager em = PersistenceUtil.getAgisDbEntityManager();
            EntityTransaction tr = em.getTransaction();
            tr.begin();

            try {
                AddressEntity address = new AddressEntity();
                updateAddress(data, address);
                em.merge(address);
                //em.persist(address);

                em.flush();
                tr.commit();
            } catch (Exception exc) {
                log.error(exc.getMessage(), exc);
                if (tr.isActive())
                    tr.rollback();
            }
        }

これが私の updateAddress メソッドです。基本的には、いくつかのフィールドを更新しています。

private void updateAddress(String[] data, AddressEntity address) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    //setting the column data
    for (int i = 0; i < data.length; i++) {
        final String column = dataColumns.get(i);
        if (!column.equals("#IGNORE#")) {
            setProperty(address, column, data[i]);
        }
    }
    for (String field : this.defaultColumns.keySet()) {
        if (!field.startsWith("#"))
            setProperty(address, field, this.defaultColumns.get(field));
    }        
}

これが私のpersistence.xmlです。

<persistence-unit name="agisdb-PU">
    <class>com.agis.livedb.domain.AddressEntity</class>
    <properties>
        <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/agisdb"/>
        <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <property name="toplink.jdbc.user" value="root"/>
        <property name="toplink.jdbc.password" value="password"/>
    </properties>
</persistence-unit>

私が何かを逃したと思いますか?どうもありがとう!ロバート

4

2 に答える 2

1

わかりました。問題は私の住所エンティティオブジェクトにあります。idフィールドに以下を追加する必要があります。@GeneratedValue(strategy = GenerationType.identity)

ありがとうdfa!ロバート

于 2009-07-06T08:06:28.620 に答える
1

merge() ではなく、persist() を使用する必要があります

于 2009-07-06T07:27:41.617 に答える