Java 更改Hibernate映射的目标表

Java 更改Hibernate映射的目标表,java,hibernate,persistence,Java,Hibernate,Persistence,是否可以更改Hibernate映射的目标表?我的用例是,当我从一个表中获取数据时,如果无法处理数据,则将其存储在错误表中以供以后分析 虽然可以在hibernate映射中定义实体名称,但我认为这并不合适,因为它需要映射的重复。然后,将存在相同的映射,用于获取数据以及错误表中具有不同实体名称的数据副本 您对如何处理和解决这个问题有什么想法吗?简短回答-否。通过实体名称定义单独的映射是一种方法 答案很长-可以在构建SessionFactory之前通过运行时对配置进行操作。您可以从配置中定义的映射中获取

是否可以更改Hibernate映射的目标表?我的用例是,当我从一个表中获取数据时,如果无法处理数据,则将其存储在错误表中以供以后分析

虽然可以在hibernate映射中定义实体名称,但我认为这并不合适,因为它需要映射的重复。然后,将存在相同的映射,用于获取数据以及错误表中具有不同实体名称的数据副本


您对如何处理和解决这个问题有什么想法吗?

简短回答-否。通过实体名称定义单独的映射是一种方法

答案很长-可以在构建SessionFactory之前通过运行时对配置进行操作。您可以从配置中定义的映射中获取相关实体的映射,将其复制到新实体名称下,并将其与新名称下的基础表的副本关联。实际上,您仍然需要定义一个单独的映射,但这样做很困难


请看。

简短回答-否。通过实体名称定义单独的映射是一种方法

答案很长-可以在构建SessionFactory之前通过运行时对配置进行操作。您可以从配置中定义的映射中获取相关实体的映射,将其复制到新实体名称下,并将其与新名称下的基础表的副本关联。实际上,您仍然需要定义一个单独的映射,但这样做很困难


看看。

正如@ChssPly76所提到的,您可以跳过Hibernate的API环来获得原始配置,修改它们,并为自己构建一个新的SessionFactory

另一个同样令人不快的解决方案是使用XSLT获取映射配置文件并将表名替换为其他名称,然后将修改后的文件馈送到hibernate以构建新的SessionFactory


这很不正常,但这确实意味着您可以避免陷入Hibernate的深渊。

正如@ChssPly76所提到的,您可以跳过Hibernate的API环来获得原始配置,修改它们,并为自己构建一个新的SessionFactory

另一个同样令人不快的解决方案是使用XSLT获取映射配置文件并将表名替换为其他名称,然后将修改后的文件馈送到hibernate以构建新的SessionFactory

这很不正常,但它确实意味着你可以避免陷入冬眠的深渊。

如前所述

如果无法处理数据,则将其存储在错误表中以供以后分析

除了chsspy76的答案之外,您还可以定义一个全局HibernateException处理程序。如果您使用Spring包装hibernate连接,那么您应该在数据库或其他设备(如网页)中使用DataAccessException和日志错误详细信息,您可以在任何地方看到它

关于,

如前所述

如果无法处理数据,则将其存储在错误表中以供以后分析

除了chsspy76的答案之外,您还可以定义一个全局HibernateException处理程序。如果您使用Spring包装hibernate连接,那么您应该在数据库或其他设备(如网页)中使用DataAccessException和日志错误详细信息,您可以在任何地方看到它


关于,

您可以使用超类吗?如果数据具有所有相同的映射信息,但属于不同的表,则可以将映射放置在两个实体的公共父类上。使用映射的超类定义公共属性,然后将每个具体类定义为不同的实体,继承属性。在hibernate注释中,这是通过在父对象上使用@MappedSuperclass注释来完成的。

您可以使用超类吗?如果数据具有所有相同的映射信息,但属于不同的表,则可以将映射放置在两个实体的公共父类上。使用映射的超类定义公共属性,然后将每个具体类定义为不同的实体,继承属性。在hibernate注释中,这是通过在父对象上使用@MappedSuperclass注释来完成的。

您使用的是hibernate XML映射,而不是注释吗?您使用的是hibernate XML映射,而不是注释吗?当然,您对如何通过编程实现这一点有什么想法吗?您需要熟悉javax.xml.transform以及XSLT本身。我的意思是使用Hibernate API+1。现在有一种跳出框框的想法:-这肯定会更容易,尽管我可能会在构建期间或应用程序初始化期间,但在初始化SessionFactory之前运行它。当然,您对如何以编程方式实现这一点有想法吗?您需要熟悉javax.xml.transform,我的意思是使用HibernateAPI+1。现在
有一种跳出框框的想法:-这肯定会更容易,尽管我可能会在构建期间或应用程序初始化期间,但在初始化SessionFactory之前运行它。我添加了一个指向另一个类似问题的链接,其中包含一些详细信息。除了上面描述的内容之外,您还需要制作一个从Mappings.getClass获得的类的副本,并在通过PersistentClass.setEntityName更改实体名称后通过Mappings.addClass将其添加回。非常感谢,我将尝试这种方法。难道你不认为当你得到一个类getClass时,你修改了一个内部实例,所以这种方法不会产生另一个类,而只是改变了它的实体名吗?然后就需要克隆。这就是为什么我说复制:-它也必须是深度复制,克隆也不能工作PersistentClass无论如何都是不可克隆的。顺便说一句,如果这是唯一需要做的事情,例如,使用不同的实体名称复制映射;没有其他的操纵,请考虑斯卡夫曼的建议。应用XSLT肯定比HibernateAPI操作更容易。在回答另一个问题时,您提到您做了这种配置操作。你能提供你的代码吗,在哪里复制PersistentClass&Table?我已经添加了一个链接到另一个有一些细节的类似问题。除了上面描述的内容之外,您还需要制作一个从Mappings.getClass获得的类的副本,并在通过PersistentClass.setEntityName更改实体名称后通过Mappings.addClass将其添加回。非常感谢,我将尝试这种方法。难道你不认为当你得到一个类getClass时,你修改了一个内部实例,所以这种方法不会产生另一个类,而只是改变了它的实体名吗?然后就需要克隆。这就是为什么我说复制:-它也必须是深度复制,克隆也不能工作PersistentClass无论如何都是不可克隆的。顺便说一句,如果这是唯一需要做的事情,例如,使用不同的实体名称复制映射;没有其他的操纵,请考虑斯卡夫曼的建议。应用XSLT肯定比HibernateAPI操作更容易。在回答另一个问题时,您提到您做了这种配置操作。您能提供您的代码吗,在哪里复制PersistentClass&Table?