在我从事的项目中,我不使用Spring,而仅使用Hibernate。我不想将hbm.xml文件用于实体映射/描述/等。我只想使用注释。
如何告诉Hibernate Entity/Table从某些包中加载所有带注释的类?
Entity/Table
我在网上搜索,但没有运气。我也找不到有关最新的Hibernate版本的信息(大多是过时的文章/帖子/等)。
编辑1:
http://docs.jboss.org/hibernate/orm/4.3/manual/zh- CN/html_single/#mapping
hibernate文档页面显示以下内容:
可以通过三种方法定义对象/关系映射: 1)使用Java 5批注(通过Java Persistence 2批注) 2)使用JPA 2 XML部署描述符(在XXX章中介绍) 3)使用称为Hibernate的遗留XML文件方法hbm.xml
就是这样,我只想将1)与SessionFactory / Session Hibernate API一起使用。
编辑2:
即使我的问题被标记为重复,也不是,因为我不想使用JPA(和隐含的描述符),而只使用上面列出的方法1)。
好的,这在Hibernate 4.3.x中是不可能的,而且似乎永远不可能。
1)我对此进行了一些研究之后,似乎是一个常见的误解,Configuration.addPackage使我们可以从给定的程序包中加载所有实体类。这不是真的。我通过查看hibernate源找到了困难的方法,然后才发现上面的SO问题/答案对此进行了确认。实际上,我不太确定该怎么addPackage做,但是对于我的情况来说,它似乎不太有用。
Configuration.addPackage
addPackage
2)似乎我们可以做的一件事是调用Configuration.addAnnotatedClass我们自己的每个带注释的实体类,例如在编译时对这些类进行硬编码。或者…或者,通过使用Reflections或Guava,我们可以在运行时动态地从给定包中找到所有(即我们自己的)实体类,循环遍历它们,然后仍然调用Configuration.addAnnotatedClass。Reflections的唯一问题是它具有很多依赖关系。因此,如果我们决定使用Reflections,就必须为这个简单的事情添加9个新的JAR(这很痛苦)。使用番石榴会更容易一些,我们可以致电 ClassPath.from ( Thread.currentThread().getContextClassLoader()).getTopLevelClasses(pckg)。
Configuration.addAnnotatedClass
ClassPath.from ( Thread.currentThread().getContextClassLoader()).getTopLevelClasses(pckg)