休眠命名查询
Posted
技术标签:
【中文标题】休眠命名查询【英文标题】:hibernate named queries 【发布时间】:2011-01-18 19:28:06 【问题描述】:在休眠中,当我们这样做时,session.getNamedQuery(QUERY_NAME),我们不需要传入存储命名查询的 hbm.xml 文件的名称。 cfg 文件中提到了 hbm.xml 的名称。
问题是,如果命名查询有 5 个 hbm.xml 文件,并且查询名称存在名称冲突(即所有 5 个文件中的 QUERY_NAME 相同),hibernate 将如何解决它?
直观地说,在执行 session.getNamedQuery(QUERY_NAME) 之前,应该需要显式加载写入查询的特定 hbm.xml 文件。
【问题讨论】:
【参考方案1】:Hibernate 将所有已加载的 hbm 文件中的所有命名查询聚合在一个逻辑命名空间下(将其视为以名称为键但在 put(..) 之前对键进行重复检查的 Map)。因此,名称在给定的会话工厂中应该是唯一的。因此,请确保您的所有命名查询都是唯一的。
【讨论】:
谢谢。您认为这是一个直观的功能吗?这意味着如果我在 java 代码中遇到命名查询引用,我需要检查每个映射文件。 这表现出快速失败的行为,这意味着当休眠 cfg 发现重复名称时抛出启动前。所以是的,这很直观【参考方案2】:除了Pangea的回答:如果你想在不同的.hbm.xml
文件中有相同查询的不同版本并在它们之间进行选择,你可以通过在构造SessionFactory
时调用Configuration.addFile()
/Configuration.addInputStream()
来实现(尽管在 SessionFactory
初始化期间只能执行一次,因此您无法即时更改它们)。
【讨论】:
【参考方案3】:虽然这并不能直接解决问题,但通常的做法是为您的查询提供反映它们处理的包和实体的名称,以避免命名冲突。而不是“findUser”,您可能会有类似“com.myproject.domain.User.findByUsernameAndPassword”的内容
【讨论】:
以上是关于休眠命名查询的主要内容,如果未能解决你的问题,请参考以下文章