首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >春季RowMapper OneToMany?

春季RowMapper OneToMany?
EN

Stack Overflow用户
提问于 2014-11-05 14:39:24
回答 1查看 4K关注 0票数 1

我试图为两个对象调整两个RowMappers,它们之间存在@OneToMany关系。

假设,我有两种方法:

代码语言:javascript
复制
public Account findAccount(long id) {
    SQL = "SELECT * FROM accounts WHERE id = ?";
    Account account = template.queryForObject(SQL, new Object[] { id }, MAP_ACCOUNT);
    return account;
}


public Card findCard(String number) {
    SQL = "SELECT * FROM cards WHERE number = ?";
    Card card = template.queryForObject(SQL, new Object[] { number }, MAP_CARD);
    return card;
}

两排地图绘制者:

代码语言:javascript
复制
   private final RowMapper<Card> MAP_CARD = new RowMapper<Card>() {

    public Card mapRow(ResultSet rs, int rowNum) throws SQLException {
        Account account = findAccount(rs.getLong("account_id"));
        Card card = new DefaultCard(rs.getString("number"), account);
        return card;
    }

};

private final RowMapper<Account> MAP_ACCOUNT = new RowMapper<Account>() {

    public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
        SQL = "SELECT * FROM cards where account_id = " + rs.getLong("id");
        List<Card> cards = template.query(SQL, MAP_CARD);
        Account account = new DefaultAccount(rs.getLong("id"), rs.getString("username"), cards);
        return account;
    }
};

运行findAccount或findCard方法将引发一个异常,说明“连接太多了!”。这是因为它们之间的行映射器具有循环依赖性。我知道我这样做是错误的,我想知道如何正确地重写行映射器。非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-05 15:30:14

首先,java对象构造函数是“递归”紧密耦合的。AccountCard构造函数相互期望对方作为参数。你可以有一个没有信用卡的账户,对吗?因此,删除帐户构造函数的卡片列表。

现在转到查询,当加载帐户卡时,有两种情况:

1-加载卡从帐户:您已经有帐户,这是不必要的查询帐户为每一张卡。因此,您可以有一个MAP_CARD_FROM_ACCOUNT行映射程序,它通过参数接收帐户。

2- 加载单张卡:在这个场景中,您只需要卡及其帐户,因此对于MAP_CARD映射程序,您可以查询返回卡和帐户信息:SELECT * FROM cards C, accounts a WHERE c.account_id=a.id and number = ?

下面是映射程序代码的外观示例:

代码语言:javascript
复制
 private final RowMapper<Card> MAP_CARD_FROM_ACCOUNT = new RowMapper<Card>() {

    public void setAccount(Account account){
       this.account = account;
    }

    public Card mapRow(ResultSet rs, int rowNum) throws SQLException {
        Card card = new DefaultCard(rs.getString("number"), account);
        return card;
    }

};

 private final RowMapper<Card> MAP_CARD = new RowMapper<Card>() {

    public Card mapRow(ResultSet rs, int rowNum) throws SQLException {
        Account account = new Account(rs.getLong("a.account_id"), rs.getString("a.username");
        Card card = new DefaultCard(rs.getString("c.number"), account);
        return card;
    }

};

private final RowMapper<Account> MAP_ACCOUNT = new RowMapper<Account>() {

    public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
        SQL = "SELECT * FROM cards where account_id = " + rs.getLong("id");
        Account account = new DefaultAccount(rs.getLong("id"), rs.getString("username"));
        MAP_CARD_FROM_ACCOUNT.setAccount(account)
        List<Card> cards = template.query(SQL, MAP_CARD_FROM_ACCOUNT);
        account.setCards(cards);
        return account;
    }
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26759834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档