我对Hibernate很新。我在理解这些简单的逻辑时遇到了问题。我已经知道Spring使用@Repository来访问对象。此外,Hibernate使用@Entity来表示映射到数据库表的实体。我只是想知道是否可以使用@Repository和@Entity注释单个类,因为它们或多或少意味着相同。
答案 0 :(得分:5)
NO。
Hibernate实体由Hibernate ORM框架管理,当您通过get()或load()访问它们时,它们(及其代理)由hibernate创建。它们具有与Spring bean完全不同(且复杂)的生命周期(它们可以被附加/分离/代理/等待删除)
Spring存储库是单例,由Spring框架管理。通常,只要容器实例存在,它们就存在。可以打开和关闭新的Hibernate会话,使用新的用户会话然后过期,但是仍然会有相同的存储库单例实例。
请参阅http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html#objectstate-overview了解可能的休眠对象状态。
对于存储库实例 - 通常它们是无状态的,因为它们是服务。
RE:they more or less imply the same.
不,他们不一样。有an old joke
更换灯泡需要多少C ++程序员?你是 仍然在程序上思考。一个设计合理的灯泡对象 将从通用灯泡类继承更改方法,所以 你需要做的就是发一个改变灯泡的消息。
但优秀的OOP程序员不这么认为,根据single responsibility principle对象应该有一个改变的理由。存储库与基础结构一起使用,与业务规则无关。基础结构可能会发生变化(例如,您可能需要将对象存储在XML而不是RDBMS中),但这不应影响封装业务对象状态的类。
您可以通过从实体类引用到抽象存储库接口(实现臭名昭着的Active Record模式 - 来缓解此问题 - 它就像从灯泡引用一些抽象的灯泡插座,这似乎不是是一个很好的解决方案,因为灯泡插座和灯泡有不同的生命周期。)
这就是High Cohesion原则开始发挥作用的地方,根据这个原则,它对于一个对象来说是不合逻辑的,它的作用是反映模型的抽象,执行一些完全无关的事情,如持久性或通过网络传输。当Student
类具有print()
,saveToXml()
或transmitByHttp()
方法时,这很奇怪。
答案 1 :(得分:5)
它们并不意味着完全相同。
的 @Entity 强> 的
@Entity代表业务领域中的“事物”。它可以是任何东西 - 顾客,大象,产品。 。 。它将具有将持久存储到数据库的属性以及与这些属性相关的方法(至少它应该,除非它是一个贫血的实体,但这是一个反模式......后来,当你对它感到满意时基础知识检查Spring的@Configurable注释 - 这允许您为您的实体提供协作者)。
的 @Repository 强> 的
另一方面,@ Repository提供了一个用于检索和存储这些实体的接口。有一些框架,特别是在其他语言中,将持久性和实体属性组合在同一个对象上,但这在Java / Hibernate / Spring中并不常见。