我从评论中看到,您不能使用 ORM 或将 Person 及其地址持久化的服务。在这种情况下,您可以为此使用自定义编写器:
import java.util.List;
import javax.sql.DataSource;
import org.springframework.batch.item.ItemWriter;
import org.springframework.jdbc.core.JdbcTemplate;
public class PersonWriter implements ItemWriter<Person> {
private JdbcTemplate jdbcTemplate;
public PersonWriter(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public void write(List<? extends Person> items) {
for (Person person : items) {
jdbcTemplate.update("INSERT INTO Person ...");
for (Address address : person.addresses) {
jdbcTemplate.update("INSERT INTO Address ... where person_id = ?", person.getId());
}
}
}
}
另一种方法是委托给两个 jdbc 批处理项编写器:
import java.util.Collections;
import java.util.List;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.database.JdbcBatchItemWriter;
public class PersonItemWriter implements ItemWriter<Person> {
private JdbcBatchItemWriter<Person> personWriter;
private JdbcBatchItemWriter<Address> addressWriter;
public PersonItemWriter(JdbcBatchItemWriter<Person> personWriter, JdbcBatchItemWriter<Address> addressWriter) {
this.personWriter = personWriter;
this.addressWriter = addressWriter;
}
@Override
public void write(List<? extends Person> persons) throws Exception {
for (Person person : persons) {
personWriter.write(Collections.singletonList(person));
List<Address> addresses = person.getAddresses();
for (Address address : addresses) {
address.setPersonId(person.getId());
}
addressWriter.write(addresses);
}
}
}