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

Envers:没有附加审核表的单向OneToMany吗?

康恩
2023-03-14
问题内容

以下数据库架构:

员工[EMP_ID(PK),姓名,薪水]

电话[ID(PK),number_str,OWNER_ID(FK)]

Employee_aud [EMP_ID(PK),REV(PK / FK),REVTYPE,姓名,薪水]

Phone_aud [ID(PK),REV(PK / FK),REVTYPE,number_str]

Employe_phone_aud [REV(PK / FK),OWNER_ID(PK / FK),REVTYPE(PK / FK)]

可以用以下Java实体表示:

员工人数

@Entity
@Audited
public class Employee {

    @Id
    @GeneratedValue
    @Column(name = "EMP_ID")
    private long id;

    @Column
    private String name;

    @Column
    private int salary;

    @OneToMany
    @JoinColumn(name = "OWNER_ID", referencedColumnName = "EMP_ID")
    private final List<Phone> phones = new ArrayList<Phone>();

    public Employee(final String name, final int salary) {
        this.name = name;
        this.salary = salary;
    }

    public long getId() {
        return id;
    }

    public void setId(final long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(final int salary) {
        this.salary = salary;
    }

    public void addPhone(final Phone phone) {
        this.phones.add(phone);
    }
}

电话

@Entity
@Audited
public class Phone {

    @Id
    @GeneratedValue
    private long id;

    @Column(name = "number_str")
    private String number;

    public Phone(final String number) {
        this.number = number;
    }

    public long getId() {
        return id;
    }

    public void setId(final long id) {
        this.id = id;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(final String number) {
        this.number = number;
    }
}

如您所见,审核表之间有一个链接表,但实体表之间没有任何链接表。在《 Hibernate-Envers开发人员指南》中,我找到了以下文本:

当使用这两个(@ OneToMany + @
JoinColumn)批注映射集合时,Hibernate不会生成联接表。但是,Envers必须这样做,以便在阅读相关实体已更改的修订时,不会得到错误的结果。

这是我对本文的解释:我的员工实体可能属于许多电话实体。如果我向某个员工添加电话,那么我的员工将被修改,因此必须进行审核。使用上面的映射,这将导致电话实体而不是员工的审核条目。使用链接表可以解决此问题(因为该表描述了员工拥有的电话集合中的更改)。

现在我有3个问题:-我是否正确理解上述说法,还是缺少一些特别之处?-如果Envers未创建此链接表,则还可以通过查看phone_aud表来跟踪这些关系。这是真的?-是否可以配置/扩展Envers以支持此行为?

注意:我问这个问题只是因为我想知道是否有可能摆脱多余的链接表并更好地了解为什么需要它。

谢谢!


问题答案:
  1. 是的,您正确理解了文档中的说明
  2. 是的,但是阅读“电话”更改的历史记录将为您提供相同的后续对象(因为只有emp_id会更改)
  3. 不,目前无法更改此行为。除非您将映射更改为双向一对多关系


 类似资料:
  • 我在试图让被审计的实体引用未被审计的实体时遇到问题。在我们的应用程序中,某些实体在没有使用hibernate的情况下被引导,这些实体是我们的元模型,不需要被审计。 如果我执行代码: 一切都很顺利,但是如果我试图获得B的版本,就会出现错误: 组织.Hibernate.对象不发现例外:不存在具有给定标识符的行 [元foo] Envers通过对metafoo实体的惰性引用成功地查找了B实体。然而,当尝试

  • 我有一个项目,我有我所有的实体。我还有另一个项目,我试图获取每个给定实体的每个已审核表的所有数据。使用Hibernate的envers,我知道如何在以前的版本中检索对象。 但是我不知道如何使用rev et typerev字段在经过审计的X中获取所有记录数据。 有什么想法吗?

  • 问题内容: 我正在使用Hibernate Envers来审核我的实体。但是我有一个问题。我想审核一个具有ManyToMany关系的实体。我发现存在一个@AuditJoinTable,但是我不知道它是如何工作的。有人可以举一个例子吗? 问题答案: 审核多对多关系应该可以在没有任何其他配置的情况下进行,前提是必须对关系的双方进行审核。 关于,注释用于指定联接表的自定义表名称。看到: http://do

  • 订单审核接口 使用场景 通过订单审核接口,开发者可以在自己的后台中审核兑吧的待审核订单。如果开发者自己已经有一套审核的系统,可以使用该接口对接。 如果这个订单需要审核,兑吧会在扣积分接口请求中带上waitAudit参数,开发者自行在自己的系统生成待审核记录。 开发者在自己系统操作审核的时候,调用审核接口,把审核通过的订单:passOrderNums ,审核拒绝的订单rejectOrderNums传

  • 我使用Hibernate 4.0与envers 当我做更新或插入时,数据被保存到审计表中,模式为0和1 我想在插入后禁用审核。有人能告诉我如何禁用它吗。 我从4.0版本中读到了Hibernate,它会自动注册事件进行审计。 我想知道有什么方法可以禁用insert上的审核?

  • 问题内容: 我使用Hibernate Envers审核我的实体。 我有一个审核的实体,它具有as属性。但是,我不想审核实体。因此,我写道: 现在,我要检索的修订: 不幸的是,当我想检索所有数据时(即,当它延迟加载时),我得到了error ,因为它试图查询: 我虽然使用,但Hibernate Envers会保持与 当前 实体项目的链接。 __ 那么如何解决我的问题,而不必显式审核表和(联接表)?在别