您需要使用XML版本 http://docs.jboss.org/hibernate/stable/core/reference/en/html/tutorial-firstapp.html#tutorial-firstapp-mapping配置而不是注释。这样您就可以在运行时动态生成 XML。
或者也许是类似的东西动态JPA http://www.dynamicjava.org/projects/dynamic-jpa你会感兴趣吗?
我认为有必要进一步厘清这个问题的问题。
第一个问题是:可以存储实体的一组表是否已知?我的意思是您不是在运行时动态创建表并希望将实体与它们关联。比方说,这种情况需要知道三个表编译时。如果是这种情况,您可以使用 JPA 继承。 OpenJPA 文档详细介绍了每个班级的桌子 http://openjpa.apache.org/builds/1.0.2/apache-openjpa-1.0.2/docs/manual/jpa_overview_mapping_inher.html#jpa_overview_mapping_inher_tpc继承策略。
这种方法的优点是它是纯JPA的。然而它也有局限性,因为表必须是已知的,并且您不能轻易更改给定对象存储在哪个表中(如果这是您的要求),就像 OO 系统中的对象通常不会更改类一样或键入。
如果您希望它真正动态并在表之间移动实体(本质上),那么我不确定 JPA 是适合您的工具。一个大量的魔法 http://www.cforcoding.com/2009/05/orms-vs-sql-jpa-story.html使 JPA 正常工作,包括加载时编织(检测)以及通常的一层或多层缓存。更重要的是,实体管理器需要记录更改并处理管理对象的更新。据我所知,没有一种简单的工具可以指示实体管理器将给定实体存储在一个表或另一个表中。
这样的移动操作将隐式地要求从一个表中删除并插入到另一个表中。如果有子实体,这会变得更加困难。请注意,这并非不可能,但这是一个不寻常的极端情况,我不确定是否有人会打扰。
较低级别的 SQL/JDBC 框架,例如Ibatis http://www.cforcoding.com/2009/06/spring-and-ibatis-tutorial.html可能是一个更好的选择,因为它会给你你想要的控制权。
我还考虑过在运行时动态更改或分配注释。虽然我还不确定这是否可能,但即使是,我也不确定它一定有帮助。我无法想象实体管理器或缓存不会因发生这种事情而陷入绝望的困惑。
我想到的另一种可能性是在运行时动态创建子类(作为匿名子类),但这仍然存在注释问题,并且我再次不确定如何将其添加到现有的持久性单元中。
如果您提供有关您正在做什么及其原因的更多详细信息,可能会有所帮助。不管是什么,我倾向于认为你需要重新考虑你正在做什么或如何做,或者你需要选择不同的持久性技术。