将数据库表映射到Java类 - 依赖关系

时间:2016-06-03 20:25:37

标签: java sql database postgresql data-binding

我试图将数据库表表示为Java对象。我不想使用JPA或Hibernate。我使用JDBC来实际连接数据库。

目前我有三张桌子:

  • 拥有Id(主键)唯一电子邮件和个人资料ID(个人资料表的外键)的用户

  • 配置文件,具有Id(主键),一些额外的字符串,用户ID(用户表的外键)和contact-id(联系表的外键)

  • 联系人,其中包含一些String列,Id(主键)和owner-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中只实现那些东西 这是否是正确的方法,考虑到这些额外的信息?

2 个答案:

答案 0 :(得分:1)

我的建议是从以EE为中心的DAO概念转向以域驱动的设计。它被广泛传播以定义DAO接口(如果你走这条路线,请不是类)是一种Java实体到数据库表映射,然后在不同的业务流中使用这些DAO的集合。缺点是您的业务代码与DAO紧密耦合,并且您有一些问题,例如您要提供的#34;泛型"对于没有通用用例的解决方案。

相反,定义另一种类型的数据API,一种由业务域流驱动,仅适用于该特定流或业务域。可以将其视为业务流在不同步骤中所需的数据的高级API,因此使用高级输入和高级输出实现它,而不是直接进行DB映射。想象一下,您正在定义一个REST API,您将为外部用户提供哪种请求和响应来操作数据,禁止在该接口级别获得任何内部知识。

完成后你会

  1. 解耦业务逻辑的不同领域;
  2. 提供小型可测试API(接口)以涵盖每个业务流程
  3. 将彻底放松对所有这些DAO功能的控制权 - 两年前有人放在哪里 - 以及他们在哪里使用
  4. 将能够迁移到不同的数据库技术(我并不意味着从Oracle到MSSQL,但如果您决定需要,则可以转到例如No-SQL解决方案)
  5. 最终将拥有其他人可以理解的设计

答案 1 :(得分:1)

“我真的不喜欢它,如果背景中发生了很多你无法控制的事情” - JPA解决了你的问题,它是一个行业广泛,经过战斗验证的API,有几个很好的实现。 EclipseLink是参考实现,根据我的经验,Hibernate更加丰富,它们都能满足您的需求。它还将为您处理事务的事务方面。为了回应你的担忧,我想不出你需要控制的任何东西。

我认为,为什么要维护和测试自己的代码来执行每个Java开发人员正在做的事情,当有专家编写的库是免费的吗?