Использование Spring JDBC RowMapper для нетерпеливых выборок

Вопрос касается наилучшей практики использования RowMapper в сценариях master/detail, где мы хотим быстро получать детали с помощью spring jdbc.

Предположим, что у нас есть классы Invoice и InvoiceLine.

public class Invoice{
    private BigDecimal invId;
    private Date invDate;
    private List<InvoiceLine> lines;
}
public class InvoiceLine{
    private int order;
    private BigDecimal price;
    private BigDecimal quantity;
}

При использовании Spring Jdbc с устройством отображения строк у нас обычно есть

public class InvoiceMapper implements RowMapper<Invoice>{
    public Invoice mapRow(ResultSet rs, int rowNum) throws SQLException {
         Invoice invoice = new Invoice();
         invoice.setInvId(rs.getBigDecimal("INVID"));
         invoice.setInvDate(rs.getDate("INVDATE"));
         return invoice;
    }
}

Теперь проблема в том, что я хочу быстро получить InvoiceLine, связанный с этим экземпляром счета. Было бы нормально, если бы я запрашивал базу данных в классе rowmapper? Или кто-то предпочитает другой путь? Я использую шаблон ниже, но не доволен этим.

public class InvoiceMapper implements RowMapper<Invoice>{
    private JdbcTemplate jdbcTemplate;
    private static final String SQLINVLINE=
            "SELECT * FROM INVOICELINES WHERE INVID = ?";

    public Invoice mapRow(ResultSet rs, int rowNum) throws SQLException {
         Invoice invoice = new Invoice();
         invoice.setInvId(rs.getBigDecimal("INVID"));
         invoice.setInvDate(rs.getDate("INVDATE"));
         invoice.setLines(jdbcTemplate.query(SQLINVLINE, 
                          new Object[]{invoice.getInvId},new InvLineMapper());

         return invoice;
    }
}

Я чувствую, что с этим подходом что-то не так, но лучшего способа найти не удалось. Я был бы более чем рад, если бы кто-нибудь мог показать мне, почему это плохой дизайн, и если да, то каким будет правильное использование.

12
задан Serkan Arıkuşu 12 July 2012 в 15:26
поделиться