我可以让 Hibernate 通过工厂方法创建一个对象吗?

Posted

技术标签:

【中文标题】我可以让 Hibernate 通过工厂方法创建一个对象吗?【英文标题】:Can I have Hibernate create an object through factory method? 【发布时间】:2009-06-05 00:48:47 【问题描述】:

有没有办法在 Hibernate 中映射工厂方法(而不是让 Hibernate 调用默认构造函数并反射设置属性或字段)?

如果它不能被映射,Hibernate 是否提供了一个钩子来逐个类地创建自定义对象?

谢谢!

【问题讨论】:

【参考方案1】:

这是可行的:

一个自定义的EntityPersister 实现(你可以register for a particular entity during Hibernate initialization using a custom Configuration)~or~ 实现Interceptor.instantiate()方法的自定义Interceptor

我认为拦截器方法更容易。这是Interceptor.instantiate()的javadoc:

/**
 * Instantiate the entity class. Return <tt>null</tt> to indicate that Hibernate should use
 * the default constructor of the class. The identifier property of the returned instance
 * should be initialized with the given identifier.
 *
 * @param entityName the name of the entity
 * @param entityMode The type of entity instance to be returned.
 * @param id the identifier of the new instance
 * @return an instance of the class, or <tt>null</tt> to choose default behaviour
 */
public Object instantiate(String entityName, EntityMode entityMode, Serializable id) throws CallbackException;

【讨论】:

这些解决方案都没有解决问题的“反射设置属性或字段”部分。【参考方案2】:

Take a lookUserType。您需要在 nullSafeGet() 中调用您的工厂并自己填充所有字段。反向工作在 nullSafeSet() 中完成。

【讨论】:

【参考方案3】:

如果它不能被映射,会 Hibernate 提供了一个自定义钩子 逐类创建对象 依据?

查看实体侦听器。这些仅添加了可以帮助您的注释。想想@PrePersist 或@PostLoad。

【讨论】:

【参考方案4】:

请参阅Hibernate and Spring transactions - using private constructors/static factory methods,但不是避免“反射设置属性或字段”部分的解决方案。

【讨论】:

【参考方案5】:

我不知道我是否完全理解您的要求,但我认为这里描述了一个解决方案(参见解决方案 4 - Hibernate 拦截器,方法 onLoad):“使用 Spring 和 Hibernate 进行域驱动设计”@ 987654321@

【讨论】:

不,onLoad 不允许改变 Hibernate 实例化实体的方式,这就是问题所在。 我以为问题是在问如何填充这些对象,据我所知,Interceptor.instantiate 没有得到任何参数值,只有类名和对象 id

以上是关于我可以让 Hibernate 通过工厂方法创建一个对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:个人浅谈工厂模式

javascript设计模式-抽象工厂模式

工厂方法

工厂方法

工厂方法

工厂方法