在hibernate中,当我们执行session.getNamedQuery(QUERY_NAME)时,我们不需要传入存储命名查询的hbm.xml文件的名称。 cfg文件中提到了hbm.xml的名称。
问题是,如果命名查询有5个hbm.xml文件,并且查询名称存在名称冲突(即所有5个文件中的QUERY_NAME相同),hibernate将如何解决它?
直观地说,它在执行session.getNamedQuery(QUERY_NAME)之前出现,应该需要显式加载写入查询的特定hbm.xml文件。
答案 0 :(得分:1)
Hibernate将所有已命名的查询汇总到它在一个逻辑命名空间下加载的所有hbm文件中(将其视为一个名称为键的Map,但在put(..)之前对键进行重复检查)。因此,名称在给定的会话工厂中应该是唯一的。因此,请确保所有命名查询都是唯一的。
答案 1 :(得分:0)
除了Pangea的回答:如果您想在不同的.hbm.xml
文件中使用相同查询的不同版本并在它们之间进行选择,您可以通过调用Configuration.addFile()
/ Configuration.addInputStream()
来执行此操作在构造SessionFactory
时(尽管在SessionFactory
初始化期间只能执行一次,因此您无法动态更改它们。)
答案 2 :(得分:0)
虽然这并没有直接解决这个问题,但通常的做法是为您的查询提供反映其处理的包和实体的名称,以避免命名冲突。而不是“findUser”,你可能会有“com.myproject.domain.User.findByUsernameAndPassword”这样的东西