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

Hibernate,保存对象的先前状态

伍耀
2023-03-14
问题内容

是否有任何使用hibernate的公认的,行之有效的方式来保存实体在数据库中的更改历史?

我们需要跟踪相当多的对象,并且希望能够撤消对对象的更改。

我尝试使用hibernate模式的拦截器,但是对象的旧状态仅在执行时可用merge()。大多数情况下我们update()还是这样做saveOrUpdate()

我目前正在让warp-persist和Guice一起管理会议。


问题答案:

我已经完成了一个拦截器(基于EmptyInterceptor创建自己的拦截器)。我能够在onFlushDirty()中获得所有更改(合并,保存,saveOrUpdate和删除)。

我使用的EmptyInterceptor方法:

@Override
public boolean onFlushDirty(Object object, Serializable id,
    Object[] newValues, Object[] oldValues, String[] properties,
    Type[] types) throws CallbackException {

@Override
public boolean onSave(Object object, Serializable id, Object[] newValues,
    String[] properties, Type[] types) throws CallbackException {

@Override
public void onDelete(Object object, Serializable id, Object[] newValues,
    String[] properties, Type[] types) throws CallbackException {

在onFlushDirty()中,我必须查询实体的先前状态:

Connection c = sessionFactory.getCurrentSession().connection();
Session session = sessionFactory.openSession(c);

BaseEntity newBaseEntity = (BaseEntity) object;
BaseEntity oldBaseEntity = (BaseEntity) session.get(newBaseEntity.getClass(), newBaseEntity.getId());


 类似资料:
  • 我在保存具有ManyToOne双向关系的实体时遇到问题,如下所示: 警告:HHH000437:试图保存一个或多个与未保存的瞬态实体具有不可为空的关联的实体。在保存这些从属实体之前,必须在操作中保存未保存的瞬态实体。未保存的临时实体:([com . epam . apartments booking . model . city # 912])依赖实体:([[com . epam . apartme

  • 考虑以下Javascript正则表达式代码: 第二个正则表达式,尽管不匹配,但保留第一个正则表达式匹配。 RegExp对象不应该是空的,因为第二个正则表达式不匹配吗?

  • 问题内容: 由于目的,我需要在插入后立即获取对象的ID。我可以解决以下代码: 我认为上面的代码还不够,因为会话需要重新打开才能找到对象。所以: 有没有更好的方法来获取ID? 如果有的话,在插入一袋对象后是否可以应用相同的策略来获取ID列表? 问题答案: 该session.save(对象)返回对象的ID,或者你可以进行保存或者之后调用ID getter方法。 Save()返回值: 返回值: Gett

  • 出于某种目的,我需要在插入后立即获取对象的id。我可以使用以下代码: 我认为上面的代码不够,因为会话需要重新打开才能找到对象。所以: 有没有更好的办法获得身份证 如果有,我可以在插入一包对象后应用相同的策略来获取ID列表吗

  • 当我读到cascade和inverse时,有人说它们都在做完全不同的事情。级联:在级联中,在一个操作(保存、更新和删除)完成后,它决定是否需要调用其他操作(保存、更新和删除)对其他相互有关系的实体。反向:这用于决定哪一方是管理关系的关系所有者(插入或更新外键列)。 假设我保存有一些孩子的父级。所以当我一方面用inverse="true"cascade="all"设置一对多时,我希望孩子是关系的所有

  • 错误: 我还尝试了,但是 病因是什么?显然,我设置了nullable=true(在数据库中也是如此),尽管我有这个错误。有什么想法吗?