Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不使用框架的持久层_Java_Hibernate_Jpa - Fatal编程技术网

Java 不使用框架的持久层

Java 不使用框架的持久层,java,hibernate,jpa,Java,Hibernate,Jpa,我已经构建了一个小型J2EE消息板应用程序。持久层使用JPA hibernate来处理关系/对象映射和数据存储。我知道并非所有应用程序都使用JPA类型的框架来建模数据,有些应用程序使用更基于jdbc的方法,更为手动,直接与表交互 我试图做的是在不使用JPA的情况下重新创建我的持久性逻辑,只是为了了解实现的外观 我已经重新创建了一些简单的操作,比如检索所有用户ID,现在,我正在尝试使用getUserById方法,它接收用户ID并返回用户对象 我在这里基本上有3门课: -User(has attri

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

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

我已经重新创建了一些简单的操作,比如检索所有用户ID,现在,我正在尝试使用getUserById方法,它接收用户ID并返回用户对象

我在这里基本上有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)
我认为通过查询3个表来建立一个用户对象很简单,但我发现当我开始建立用户已经开始的线程列表时,我必须建立那些线程对象,这意味着去寻找他们的作者,他们发表了什么文章,等等,这一切都变得一团糟,所以我很确定我让事情变得更难了

hibernate解决方案工作得很好,因为它可以处理连接和实际的表级查询,但是对于不使用jpa的商店来说,用纯sql重新创建这些复杂对象有那么困难吗,特别是当对象之间有引用时,比如线程和post对象

我想我错过了什么

我可以通过一次查询获得id、用户名和密码,这很简单。
我可以通过一个查询获得所有用户的帖子,但当涉及到创建线程列表对象时,这就变得奇怪了。

只需从Hibernate启用show_sql并复制和粘贴生成的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;
}

这将从用户获取所有线程。对于这些线程中的每一个,它都会得到所有的帖子。此外,它将获得该用户的所有帖子。最后,它将获取所有用户帖子的所有线程。

好吧,sql不是最难的部分,它是手动重新创建用户对象。我可以通过一次查询获得id、用户名和密码,这很简单。我可以通过一个查询获得所有用户的帖子,但当涉及到创建线程对象列表时,这就是问题的症结所在。必须在循环中创建线程对象,然后将它们保存在用户对象内的java.util.Collection中。从SQL构建对象总是一样的,不管它是用户对象还是线程对象。也许您还可以看看一些NoSQL解决方案,您可以在一个文档中存储所有这些一对多关系。并在不连接数据的情况下检索它。对线程的查询不会返回线程对象的列表,它是手动的。手动是什么意思?如果您使用的是SQL,则可以从DB获取列表。只需创建一个类似SELECT*FROM Thread WHERE Thread.id的查询,它看起来像什么?现在我正在使用语句执行查询,返回值是一个ResultSet对象,我使用rs.getStringcol_name迭代并手动提取列值
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;
}