hibernate命名查询

时间:2011-01-18 19:28:06

标签: hibernate

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

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

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

3 个答案:

答案 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”这样的东西