2

我有两个 bean (POJO) - 一个 Customer 和一个这样定义的地址类:

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 回答