我试图将数据库表表示为Java对象。我不想使用JPA或Hibernate。我使用JDBC来实际连接数据库。
目前我有三张桌子:
拥有Id(主键)唯一电子邮件和个人资料ID(个人资料表的外键)的用户
配置文件,具有Id(主键),一些额外的字符串,用户ID(用户表的外键)和contact-id(联系表的外键)
现在我的User类看起来像这样:
public class User {
private Integer id;
private String email;
private Profile profile;
}
我的Profile类看起来像这样:
public class Profile {
private Integer id;
private User owner;
private Contact contact;
private String picturePath;
private String hobbys;
private String job;
}
最后是Contact类:
public class Contact {
private Integer id;
private User owner;
private String firstName;
private String middleName;
private String lastName;
}
所以我计划为每个类编写一个Dao,它为数据库请求提供不同的方法,执行请求并相应地返回对象。
我认为在每个Dao中检索一个完整对象的函数会很好。这意味着,对于UserDao,它返回一个用户,其中填充了id和email,并且还根据DB中的相应值创建了Profile对象。因此,此Profile对象中的Contact也将从DB中相应的Contact条目填充。
我现在遇到的问题是如何组织这个问题,因为对于用户我必须要求ProfileDao创建一个Profile对象,而在ProfileDao中,我需要向ContactDao询问相应的联系人。 ContactDao通常会尝试获取用户,因为完全创建Contact对象需要它 所以我需要以某种方式告诉Daos只检索对象本身而不是链接对象 但这对我来说似乎很奇怪。
这真的是正确的方法吗?就像用一个额外的参数调用ContactDao一样,该参数告诉Dao只能得到一个平面表示 或者我应该仅通过用户的ID将用户链接到联系人,并提供在需要时检索相应用户的功能?
解决这个问题的正确方法是什么?
修改
在我看来,我可能已经留下了重要的信息(因为我不知道它可能很重要)。实际上@Oleg的答案给了我这种见解
我实际上做的是:我构建一个SOAP Web服务,它应该处理与数据库的所有连接,但(显然)也是整个内部逻辑。最重要的是,我想创建一个可以集成到网页或应用程序中的SOAP客户端
我的想法是,我需要以我能想象的任何方式提供访问数据库中数据的所有可能性。但@Oleg的答案似乎暗示了其他的东西:
如果我正在实现一个SOAP-API(他的例子是REST,但最后它并不重要),我应该只关心我需要的东西。
比如说如果我想拥有一个用户,我只需创建一个带有ID和电子邮件的用户对象。如果我想拥有该用户的个人资料,我会做另一个请求,它会给我一个平面配置文件对象。然后我也会在我的API中只实现那些东西
这是否是正确的方法,考虑到这些额外的信息?
答案 0 :(得分:1)
我的建议是从以EE为中心的DAO概念转向以域驱动的设计。它被广泛传播以定义DAO接口(如果你走这条路线,请不是类)是一种Java实体到数据库表映射,然后在不同的业务流中使用这些DAO的集合。缺点是您的业务代码与DAO紧密耦合,并且您有一些问题,例如您要提供的#34;泛型"对于没有通用用例的解决方案。
相反,定义另一种类型的数据API,一种由业务域流驱动,仅适用于该特定流或业务域。可以将其视为业务流在不同步骤中所需的数据的高级API,因此使用高级输入和高级输出实现它,而不是直接进行DB映射。想象一下,您正在定义一个REST API,您将为外部用户提供哪种请求和响应来操作数据,禁止在该接口级别获得任何内部知识。
完成后你会
答案 1 :(得分:1)
“我真的不喜欢它,如果背景中发生了很多你无法控制的事情” - JPA解决了你的问题,它是一个行业广泛,经过战斗验证的API,有几个很好的实现。 EclipseLink是参考实现,根据我的经验,Hibernate更加丰富,它们都能满足您的需求。它还将为您处理事务的事务方面。为了回应你的担忧,我想不出你需要控制的任何东西。
我认为,为什么要维护和测试自己的代码来执行每个Java开发人员正在做的事情,当有专家编写的库是免费的吗?