Hibernate从存储库加载UserType对象

时间:2009-06-09 08:58:03

标签: java hibernate

设置:我的数据库中有一个hibernate持久化的对象(AProduct)。此对象引用存储在存储库中的另一个对象(AComponent)。在产品的数据库表中,只应存储组件的ID。通过加载产品,我想从我的存储库加载正确的组件。

到目前为止,我的解决方案是为组件创建UserType以仅保存其ID。到目前为止,这很容易。加载组件也不是什么大问题,因为我有ID。

我的问题是如何在ComponentUserType中获取指向存储库的链接。

我正在使用java和Hibernate / Annotations,但解决方案可能是独立的。

2 个答案:

答案 0 :(得分:1)

通过“存储库”我假设您的意思是除数据库之外的一些外部数据源。网络服务还是什么?无论如何,如果存储库的链接是对所有产品对象都相同的静态配置,则可以使用静态访问器方法(例如“getInstance()”)创建单个对象来保存配置。然后,UserType对象可以从单例中提取存储库配置。如果您正在使用像Spring这样的依赖注入框架,您甚至可以使用它来从属性文件或其他东西初始化单例。更好的选择是使用Spring(或Guice或其他)将配置直接推送到UserType中。但是由于UserType对象的生命周期是由Hibernate控制的,这可能很棘手。

如果每个产品的存储库链接不同,那么将它与ID一起保存在数据库中是有意义的。一种方法是创建一个封装ID-repository配对的类以及对组件的引用。然后使用该类作为产品类中的属性类型,并将Hibernate UserType映射到几列以分别保存ID和链接。

答案 1 :(得分:0)

您是否正在使用Spring Framework初始化应用程序堆栈?如果是这样,请查看SingletonBeanFactoryLocator,它将帮助您以Spring友好的方式访问您的应用程序资源。

http://www.jdocs.com/spring/2.0.6/org/springframework/beans/factory/access/SingletonBeanFactoryLocator.html

如果您不使用Spring,我会考虑使用从应用程序堆栈中某处的静态类公开的ThreadLocal。在与UserType一起使用之前,您需要确保您的Repository绑定到ThreadLocal。