2

私は 2 つの Bean (POJO) を持っています。次のように定義された Customer クラスと Address クラスです。

public class Customer {
  private String name = null;
  private Address address = null;

  public Customer() {
    address = new Address();
  }

  public String getName() {
    return name;
  }

  public void setName(name) {
    this.name = name;
  }
  //additional setters/getters for various properties
}

public class Address {
  private String street = null;

  public String getStreet() {
    return street;
  }

  public void setStreet(street) {
    this.street = street;
  }
  //additional setters/getters for various properties
}

次のように使用して、これをデータベースに挿入しようとしています。

public class CustomerDAO extends SimpleJdbcDaoSupport {
  public int addOrganization(Customer customer) {

    SimpleJdbcInsert insertCustomer = null;
    BeanPropertySqlParameterSource params = null;
    Number customerID = null;

    insertTransaction = new SimpleJdbcInsert(getDataSource()).withTableName("customers")
            .usingGeneratedKeyColumns("customerID");

    params = new BeanPropertySqlParameterSource(customer);

    customerID = insertTransaction.executeAndReturnKey(params);

    return customerID.intValue();
  }
}

問題は、私が取得しInvalid argument value: java.io.NotSerializableException、顧客を挿入しないことです。データベースから住所を削除すると、他の顧客データが挿入されます。または、次のようなことができます。

MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("name", customer.getName());
params.addValue("street", customer.getAddress().getStreet());

しかし、それではクラスの使いやすさが失われ、BeanPropertySqlParameterSourceプロパティを追加または削除すると、別の行を追加する必要があります。

各値を手動で追加することなく、ネストされた Address Bean を格納する簡単な方法はありますか? これを実現するには、データベースや Bean をどのように定義する必要がありますか?

4

3 に答える 3

2

あなたの解決策は最も簡単です。

ネストされたオブジェクトからデータを挿入する必要があり、マップにパラメーターを追加したくない場合は、代わりにJPAの使用を検討する必要があります。

于 2010-05-23T22:10:34.710 に答える
1

MapSqlParameterSource とリフレクションを使用してこれを行う方法があります。以下のコード。(欠点は、リフレクションを使用する必要があることですが、利点は、フィールドの追加/削除について心配する必要がないことです)。

Customer クラスと Address クラスを AbstractBean または他のクラスから拡張する必要があります。

public static MapSqlParameterSource generate(Customer bean) {
    try {
        MapSqlParameterSource source = new MapSqlParameterSource();
        addAllFields(bean, source, bean.getClass().getDeclaredFields());
        return source;
    } catch (IllegalAccessException e) {
        throw new IllegalStateException("Unable to generate the parameter source", e);
    }
}

private static void addAllFields(AbstractBean bean, MapSqlParameterSource source, Field[] fields)
    throws IllegalAccessException {
    for (Field field : fields) {
        field.setAccessible(true);
        if (field.getType().isAssignableFrom(Address.class)) {
            Address address = (Address)field.get(bean);
            addAllFields(address, source, address.getClass().getDeclaredFields());
        } else {
            source.addValue(field.getName(), field.get(bean));
        }
    }
}
于 2013-06-25T16:14:29.613 に答える
0

内部 Bean を定義できます。内部 Bean のセクション 3.3.2.3 を見てください。これはリンクhttp://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-inner-beansです

于 2010-05-21T22:50:13.417 に答える