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

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

谯志诚
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实体的线程安全的信息。我可以在多个线程中修改它们,而它们仍然连接到用于加载它们的会话吗? 我不会使用延迟加载(我知道这会导致并发问题)。实体将被正确同步,Hibernate将通过同步的getters访问它们。 我设想的情景是: 使用Hibern

  • 我正在为mysql数据库创建一个REST api服务。我使用IntelliJ的持久化工具生成了类。它做得很好。 我正在使用的模式有一些古怪之处。用户希望endpoint可由“id”主键列以外的其他属性访问。 Ex:<代码>/对象/ 这里有一个问题。模式可以改变。name属性不会去任何地方,所以我可以安全地假设它将永远在对象上。 我了解到您可以使用超类强制这些生成的实体具有自定义属性而不会影响数据库

  • 我已经用hibernate的@Audited注释审计了我的实体。它有一个简单的机制,默认为每个实体创建一个REVINFO表和一个_AUD,并在每个_AUD表中创建一个与REVINFO表相关的外键。但我想对本地进行修订。这意味着我要将修订版移动到each _AUD表并删除REVINFO表。 根据Hibernate envers页面 “本地修订”,即独立地为其创建修订。这不会启用关系的正确版本控制,但

  • 我知道并使用了很多绑定的语法,但是我怎么能直接检查事件对象并提取被按下的字母,例如'c'和修饰词,例如'Control'和'Alt'? 我试过这个 偷到Python和Tkinter编程,但它没有显示我正在按的最终修饰符

  • 是否可以从2个可能的表中获取实体的字段? 例如: 父类中的字段需要根据某些条件从表a或表b中提取! 任何想法都将不胜感激! 澄清:如果父级实际上指向B实例,我不想获取B实例!表每类继承只在A的表中查找,因为我们在父类中指定了his字段的类型!? 你有其他想法吗?