持久层不使用框架

时间:2014-11-12 22:07:02

标签: java hibernate jpa

我已经构建了一个小型的J2EE留言板应用程序。持久层使用JPA(hibernate)来处理关系/对象映射和数据存储。我知道并非所有应用程序都使用JPA类型框架来建模他们的数据,有些使用更基于jdbc的方法,更加手动,直接与表进行交互。

我要做的是在不使用JPA的情况下重新创建我的持久性逻辑,只是为了了解实现的外观。

我已经重新创建了简单的操作,例如检索所有用户ID,现在,我正在尝试使用getUserById()方法,该方法接收用户ID,并返回User对象< / p>

我在这里基本上有3节课:

-User(has attributes: id,username,password,list<post>,list<thread>started)
-Thread(has attributes: id,title,list<post>, date,category,author(user),locked)
-Post(has attributes: id,author(user),date,content,thread(that it belongs to)

这些对象中的每一个都由数据库中的表表示:

USER (ID,USERNAME,PASSWORD)
THREAD(ID,AUTHOR_ID,TITLE,START_DATE,CATEGORY,LOCKED)
POSTS(ID,AUTHOR_ID,PUBLISH_DATE,CONTENT,THREAD_ID)

虽然通过查询3个表来构建User对象会很简单,但我发现的是当我构建用户已启动的线程列表时,我必须构建那些线程对象,意味着走了,发现他们的作者是谁,他们做了什么帖子等等,而且它变得一团糟,所以我很确定我是让它变得比以前更难。

hibernate解决方案完美地运行,因为它处理连接和实际的表级查询,但是对于不使用jpa的商店,用纯sql重建这些复杂对象是很困难的,特别是当对象有彼此引用,如线程和帖子对象?

我假设我错过了什么。

我可以从单个查询中获取id,用户名和密码,这很容易。 我可以使用单个查询获取所有用户帖子,但是当涉及创建线程对象列表时,它就会变得奇怪。

1 个答案:

答案 0 :(得分:0)

只需启用&#34; show_sql&#34;从Hibernate中复制并粘贴生成的SQL查询;)

循环部分的伪代码:

User user = SELECT_USER_FROM_DB;
List<Thread> threads = SELECT_THREAD_FROM_DB_WHERE_AUTHOR_ID_EQUALS_USER_ID;
user.threads = threads;
for(Thread thread : threads) {
    List<Post> posts = SELECT_POST_FROM_DB_WHERE_THREAD_ID_EQUALS_THREAD_ID;
    thread.posts = posts;
}
List<Post> posts = SELECT_POST_FROM_DB_WHERE_AUTHOR_ID_EQUALS_USER_ID;
user.posts = posts;
for(Post post : user.posts) {
    Thread thread = SELECT_THREAD_FROM_DB_WHERE_THREAD_ID_EQUALS_POST_THREAD_ID;
    post.thread = thread;
}

这将获取用户的所有线程。对于每个线程,它将获得所有帖子。此外,它将获取此用户发布的所有帖子。最后,它将为所有用户帖子获取所有线程。