Hibernate 休眠命名查询

Hibernate 休眠命名查询,hibernate,Hibernate,在hibernate中,当我们执行session.getNamedQuery(QUERY\u NAME)时,我们不需要传入存储命名查询的hbm.xml文件的名称。cfg文件中提到了hbm.xml的名称 问题是,如果命名查询有5个hbm.xml文件,并且查询名称存在名称冲突(即所有5个文件中的查询名称相同),hibernate将如何解决该问题 直观地说,它出现在执行session.getNamedQuery(QUERY\u NAME)之前,您应该需要显式地加载写入查询的特定hbm.xml文件。Hi

在hibernate中,当我们执行session.getNamedQuery(QUERY\u NAME)时,我们不需要传入存储命名查询的hbm.xml文件的名称。cfg文件中提到了hbm.xml的名称

问题是,如果命名查询有5个hbm.xml文件,并且查询名称存在名称冲突(即所有5个文件中的查询名称相同),hibernate将如何解决该问题


直观地说,它出现在执行session.getNamedQuery(QUERY\u NAME)之前,您应该需要显式地加载写入查询的特定hbm.xml文件。

Hibernate在一个逻辑命名空间下加载的所有hbm文件中聚合所有命名查询(将其视为以名称为键的地图,但在放置(..)之前在键上重复检查)。因此,在给定的会话工厂中,名称应该是唯一的。因此,请确保所有命名查询都是唯一的。

除了Pangea的答案之外:如果您希望在不同的
.hbm.xml
文件中具有同一查询的不同版本,并在它们之间进行选择,您可以通过调用
配置.addFile()来实现
/
配置。在构造
会话工厂时添加InputStream()
(尽管在
会话工厂初始化期间只能执行一次,因此您不能动态更改它们).

虽然这并不能直接解决这个问题,但通常的做法是为查询提供反映它们所处理的包和实体的名称,以避免命名冲突。您可以使用类似“com.myproject.domain.User.findByUsernameAndPassword”的名称来代替“findUser”

谢谢。您认为这是一个直观的功能吗?这意味着如果我在java代码中遇到命名查询引用,我需要检查每个映射文件。这显示了一个fail fast bahavior,这意味着hibernate cfg在发现重复名称时抛出startup ex。因此,是的,这是直观的