【发布时间】:2016-10-04 00:25:59
【问题描述】:
我试图将数据库表表示为 Java 对象。我不想使用 JPA 或 Hibernate。我使用 JDBC 来实际连接数据库。
目前我有三个表:
具有 Id(主键)、唯一电子邮件和配置文件 ID(配置文件表的外键)的用户
-
一个配置文件,其中包含一个 Id(主键)、一些附加字符串、一个用户 ID(用户表的外键)和一个联系人 ID(联系人表的外键)
- 一个联系人,它有一些字符串列、一个 Id(主键)和一个所有者 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 和电子邮件,并且 Profile 对象也是从数据库中的相应值创建的。因此,此 Profile 对象中的联系人也将从数据库中相应的联系人条目中填充。
我现在遇到的问题是如何组织这个,因为对于用户我必须要求 ProfileDao 创建一个 Profile 对象,而在 ProfileDao 中我需要向 ContactDao 询问相应的联系人。 ContactDao 通常也会尝试获取用户,因为需要完全创建 Contact 对象。
所以我需要以某种方式告诉 Daos 只检索对象本身而不是链接的对象。
但这对我来说似乎很奇怪。
这真的是正确的方法吗?就像使用附加参数调用 ContactDao 一样,该参数告诉 Dao 仅获得平面表示。
或者我应该只通过用户的 id 将用户链接到联系人,并提供在需要时检索相应用户的功能?
解决这个问题的正确方法是什么?
编辑
在我看来,我可能遗漏了一个重要信息(因为我不知道它可能很重要)。实际上@Oleg 的回答给了我这种洞察力。
我实际上在做的是:我构建了一个 SOAP Web 服务,它应该处理与数据库的所有连接,而且(显然)也处理整个内部逻辑。最重要的是,我想创建一个可以集成到网页或应用程序中的 SOAP 客户端。
我的想法是,我需要提供所有可能以任何我能想象的方式访问我的数据库中的数据。但@Oleg 的回答似乎暗示了别的东西:
如果我正在实现一个 SOAP-API(他的示例是 REST,但最后它并不重要),我应该只关心我需要的东西。
比如说如果我想拥有一个用户,我只需创建一个带有 ID 和电子邮件的用户对象。如果我想拥有该用户的个人资料,我会执行另一个请求,它会为我提供一个平面配置文件对象。然后我也会在我的 API 中只实现那些东西。
考虑到这些额外信息,这是正确的方法吗?
【问题讨论】:
-
我会将用户传递给联系人。我会允许一个 NULL 用户。但是要回答关于“正确”方式的最后一个问题,我会使用 JPA,因为它已经完成了这些工作。为什么没有这个选项?
-
嘿。谢谢。传递用户已经是比我传递布尔值来判断它应该检索平面还是深度表示的想法更好的解决方案。我宁愿不喜欢使用 JPA,因为我觉得我会将太多的控制权交给一个封装的框架。老实说,我不喜欢在后台发生这么多你无法控制的事情。
-
嗯......如果该控件正在执行您想要的操作,那么我自己看不到任何问题。我以前也有你的感觉,但是在重新发明轮子数百次之后,你终于意识到你不需要这样做。
标签: java sql database postgresql data-binding