当前位置: 首页 > 面试题库 >

休眠:检查修改了哪个实体的字段

卓学智
2023-03-14
问题内容

我有的:

我有Hibernate实体,它包含许多非瞬态字段,包​​括集合。用户可以分别更新每个字段或一次更新某些字段。

多么大的挑战:

在处理程序中,我应该检查实体的哪个字段已更改:

public void handle(Entity newVersion) {
  Session session = sessionFactory.openSession();
  Entity oldVersion = (Entity) session.get(Entity.class, entity.getId());
  List changedFields = compareChanges(oldVersion, newVersion);  //HOW TO CHECK WHICH FIELDS ARE CHANGED?
}

出于安全性和通知原因,我想这样做。手段:

  1. 并非所有用户都可以修改所有字段
  2. 我应该在某些字段更改时以特定方式通知特定用户。

有什么问题:

我得到非常丑陋的代码。实际上,我遍历所有字段/集合和调用equals方法。

题:

也许Hibernate提供了更优雅的方法来检查哪些字段已被修改? 怎么样?

聚苯乙烯

@victorantunes提供了一个解决方案,但对我来说似乎太全面了。可能是其他选择?


问题答案:

您可以做的是制作一个Hibernate Interceptor,使其在创建,修改和更新等事件中充当触发器。
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html,
以便将要修改和保留给定实体之前的任何点,1.您可以检查用户是否拥有访问权限(您可以从会话或数据库中获取用户名)来修改特定字段,因此您可以授予访问权限以保存或更新。2.您只能在修改实体时通知其他用户。

通过这种方式,您可以在Spring的Hibernate 4实施中创建一个新的会话范围拦截器。session session
s.withOptions()。interceptor(new YourInterceptor()。openSession();



 类似资料:
  • 问题内容: 我有的: 我有Hibernate实体,它包含许多非瞬态字段,包​​括集合。用户可以分别更新每个字段或一次更新某些字段。 多么大的挑战: 在处理程序中,我应该检查实体的哪个字段已更改: 出于安全性和通知原因,我想这样做。手段: 并非所有用户都可以修改所有字段 我应该在某些字段更改时以特定方式通知特定用户。 有什么问题: 我得到非常丑陋的代码。实际上,我遍历所有字段/集合和调用方法。 题:

  • 问题内容: 我在了解线程安全的详细信息时遇到了问题。我知道这本身并不是线程安全的,所以我不会从多个线程访问它们。但是,我找不到有关Hibernate实体的线程安全性的任何信息。我可以在多线程中修改它们,而又仍然将它们附加到用于加载它们的会话中吗? 我不会使用延迟加载(我知道这会导致并发问题)。实体将被正确同步,并且hibernate将通过同步的getter访问它们。 我设想的方案: 使用hiber

  • 问题内容: 我有一个实体- 。由描述。 Hibernate为每个实体创建一个表,因此当我调用时,我的数据总是保存到该表中。 现在,我需要另一个表来存储相同类型的数据,并且只需要将我的实体保存到该表中。 数据结构 (类似这样): 使用此方法 : 和结果,我应该在和 中。 由于系统限制,我无法将这两个对象放在一个表中。(即使创建额外的字段也是个坏主意)。 我可以不进行子类化吗?使用Programmat

  • 问题内容: 我有一个包含三个字段的表,例如a,b,c。我想添加一个约束,以确保如果a不为null,那么b和c也不为null。我已经使用以下SQL做到了 有没有一种方法可以使用hibernate注释@Check达到相同的效果? 我找不到带有该注释的有用示例,开发人员是否倾向于完全不使用它? 问题答案: 是的,可以在类级别使用,例如: (请注意,我使用@jarlh注释重写了您的情况。)该条款注释需要参

  • 问题内容: 我使用Hibernate 4和Spring 3。 我有两个实体。 图书实体 和作者实体 和JSON取决于pom.xml 我的根上下文在这里- … servlet-context.xml 控制器。 在我的DAO中找到findAll: 在调试中,我看到该方法返回2条记录,但是Spring无法将结果转换为JSON并返回406 HTTP错误。怎么了? 我附上我在调试中看到的图像。- http:

  • 问题内容: 我们的数据模型分为两个数据库上的架构。这些模式是隔离使用的,除了在两者之间桥接的一些单键关系。没有跨两个数据库的写事务。 与这个问题类似,我们要使用Hibernate在不同数据库中的2个表上进行联接,我们想使用Hibernate来处理实体的联接。我们不能使用数据库解决方案(DB2上的联合视图)。 我们为Hibernate设置了两个单独的数据库配置(“医生”和“病人”),当使用DAO显式