【问题标题】:A typical lifecycle of a Hibernate object in a web app -?Web 应用程序中 Hibernate 对象的典型生命周期 - ?
【发布时间】:2010-03-17 10:20:18
【问题描述】:

请描述 Web 应用程序中 Hibernate 对象(映射到数据库表)的典型生命周期。 假设您创建了一个对象的新实例并保存在数据库中。 但是在应用程序生命周期中,您将处理一个分离的对象,最后 您需要在数据库中更新它,例如在退出时。 hibernate 和 spring 看起来怎么样?

附言事务和会话可以在 servlet 转换之间存在吗?这样我们就打开了 1 个会话并在所有 servlet 中使用它而无需重新打开它?

我将尝试举一个描述性的例子。 假设,当应用程序启动时,会创建日志记录。这可以一次完成, Log log = new Log(...) 然后类似于 save(log) -- log 对应一个表 LOG。

然后,随着应用程序处理用户输入并继续运行,正在积累新数据。

在第二步之后,我们可以向日志对象添加一些东西,例如一个集合:

// 现在我们可以跟踪用户选择的内容:设置 thisUserChoice, // 所以我们可以更新持久对象,我们现在有了新数据! // log.userChoices = thisUserChoice.

这里出现了我的问题的性质。如果我们愿意,我们应该如何处理它 每当从用户那里获得新数据时更新数据库?

在关系模型中,我们可以使用行 ID,因此我们可以获取此记录并更新该行的一些其他数据。

在 Hibernate 中,我们还可以通过 id 加载对象。

但这是要走的路吗?有什么更好的吗?

【问题讨论】:

    标签: java hibernate spring


    【解决方案1】:

    您可以在一个会话中完成所有操作。但这就像在一个班级中做所有事情一样。从初学者的角度来看,这可能是有道理的,但在实践中没有人会这样做。

    在网络应用程序中,您通常可以期望同时运行多个线程,每个线程处理不同的用户。每个线程通常都有一个单独的会话,并且会话将只有该用户实际需要的对象的托管实例。并不是说你可以在自己的代码中完全忽略并发,但是有 hibernate 的帮助是很有用的。如果您要在一个会话中完成所有操作,则您必须自己完成所有并发管理。

    如果您有多个应用程序服务器与单个数据库通信,Hibernate 还可以管理并发性。在这种情况下,单独的 JVM 不可能共享同一个会话...

    hibernate documentation 中描述了生命周期(我相信您已经看到了)。

    每当请求从 Web 客户端发送到服务器时,您应该做的第一件事是加载相关对象(参见第 10.3 节),这样您就可以处理持久的,而不是分离的实体。然后,您执行所需的任何操作。当会话关闭时(即服务器向客户端返回响应时),它会将任何更新写入数据库。或者,如果您的操作涉及创建新实体,则必须创建临时实体(使用new),然后调用 persist() 或 save()(参见第 10.2 节)。这将产生一个托管实体——您可以对其进行更多更改,并且当会话关闭时,hibernate 将记录这些更改。

    我尽量避免使用分离的对象。但是如果我必须(也许它们存储在用户的session 中),那么无论何时它们可能需要保存到数据库中,你都必须使用 update() (参见第 10.6 节)。这会将其转换为托管对象,因此会话将在关闭时保存对数据库的任何更改。

    Spring 使得为每个请求生成一个新会话变得非常容易。你通常会告诉 Spring 创建一个 sessionFactory,然后每个请求都会被赋予它自己的会话。搜索“spring hibernate tutorial”,你会发现几个例子。

    【讨论】:

    • @John 好吧,如果你持久化一个新对象,它会保存在数据库中,因此并发没有意义,因为只有一个具有此 ID 的行可以存在。两个线程不能将同一个实例持久化到一个数据库中,即使它们在不同的会话中运行。每个下一个线程都会打开一个新会话。如果这里有任何问题,请纠正我。
    • 你是对的。通常,您让 hibernate 分配 id。两个线程都可以持久化新对象,hibernate 会确保它们获得不同的 id。在第 10.2 节中,“persist() 使瞬态实例持久化。但是,它不保证标识符值将立即分配给持久化实例,分配可能发生在刷新时间。persist() 还保证它不会如果在事务边界之外调用 INSERT 语句,则执行它。这在具有扩展会话/持久性上下文的长时间运行的对话中很有用。"
    【解决方案2】:

    http://scbcd.blogspot.com/2007/01/hibernate-persistence-lifecycle.html 这解释了瞬态的、持久的对象。

    还可以查看 Lifecycle interface 以了解 hibernate 的作用(它在所有阶段都提供了钩子供用户做某事)

    【讨论】:

    • 很有意思,但第一篇文章并没有举例说明如何让分离的对象回到持久状态,只是用文字描述。
    猜你喜欢
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多