我正在创建一个具有数据库访问权限的应用程序我不使用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?
答案 0 :(得分:0)
最佳做法是为每个表使用POJO域对象,您可以在其中保存address_book_id
之类的关系字段。因此,您将拥有树独立的类Contact
,Address
,AddressBook
和独立的DAO ContractDAO
,AddressDAO
,AddressBookDAO
。您的ContactService
将使用这6个对象进行操作,以加载,保存,修改相关数据。
答案 1 :(得分:0)
您可以使用装饰器模式包装要为其添加外键的实体(模型类),如下所示:
使用方法: 例如: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,以封装构建逻辑并简化流程