具有依赖关系的多个DAO(外键)

时间:2015-05-23 11:02:35

标签: java database jdbc model dao

我正在创建一个具有数据库访问权限的应用程序我不使用JPA,也不使用JooQ或其他框架(并且不想这样做。这对我的问题也不重要)。所以我使用JDBC并编写普通的sql。

我的模型看起来像这样:

public class Contact{
  AddressBook addressBok;
  String name;
  ...
}

我现在创建了2个DAO,一个用于Contact和AddressBook。 My Contact表具有AddressBook表的外键(address_book_id)。 我有一个服务类(例如ContactService),它将使用相应的DAO读取每个对象并将其组合到一个联系人。

问题现在是:我在ContactDAO的ResultSet中有address_book_id。如何将其传递给服务类,然后使用AddressBookDAO读取对应的AddressBook?由于模型是共享的,因此将String addressBookId放到Contact是一个不错的解决方案,因为使用此模型的客户可能对数据库一无所知。

我知道这些问题,但没有答案如何做到: Using DAOs with composite Objects Can a DAO call DAO?

2 个答案:

答案 0 :(得分:0)

最佳做法是为每个表使用POJO域对象,您可以在其中保存address_book_id之类的关系字段。因此,您将拥有树独立的类ContactAddressAddressBook和独立的DAO ContractDAOAddressDAOAddressBookDAO。您的ContactService将使用这6个对象进行操作,以加载,保存,修改相关数据。

答案 1 :(得分:0)

您可以使用装饰器模式包装要为其添加外键的实体(模型类),如下所示: enter image description here

使用方法: 例如:save(插入db)一个联系人(在这里我上次发现问题的地方,所以我通过此解决方案解决了它)->问题:如何在不知道fk address_book_id的情况下在save的参数中插入联系人

    public class ContactDAO extends DAO<Contact>{
    // ....
    
    @Override
    public int save(IEntity contact){
        ForeignKeyWrapper ctFk = (ForeignKeyWrapper)contact;
        int address_book_id = ctFk.getFK();
        Contact ct = (Contact)ctFk.getEntity();
        String name = ct.getName();
        // retrieve other fields of contact here
    
        //use some sql to insert the contact in the db, now you have also the fk
        String insertQuery = "INSERT INTO CONTACT(name,..other fields of contact.. , address_book_id) VALUES("+
                     name + "," +
                    /*other fields*/
                    address_book_id + ")";
        //execute it here and fetch the id of the inserted row
    
    }
    
    // ....
    }
    
    public class clientClass{
        //....
            public static void main(String[] args) {
            IEntity contact = new Contact(/* init fields*/);
            IEntity addressBook = new AddressBook(/* init fields*/);
            ForeignKeyWrapper ctFKW = new ForeignKeyWrapper(contact);
            //link contact to addressBook (e.g: when creating a contact to insert it into the db)
            ctFKW.setFK(addressBook.getId());
            ContactDAO ctDAO = new ContactDAO(/*connection*/);
            ctDAO.save(ctFKW);
        }
        //....
    
    }

您可以添加一个构建器类来构建您的联系人对象,并将其外键链接到addressBook对象ID,以封装构建逻辑并简化流程