Envers:单向 OneToMany 无需额外审核表?

2024-03-05

以下数据库架构:

员工[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实体来表示:

Employee:

@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);
    }
}

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 不会生成连接表。然而,恩弗斯必须这样做,这样当您阅读相关实体已更改的修订版时,就不会得到错误的结果。

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

现在我的3个问题: - 我对上述陈述的理解是否正确,还是我遗漏了一些特别的东西? - 如果 Envers 没有创建此链接表,也可以通过查看phone_aud 表来跟踪这些关系。这是真的? - 是否可以配置/扩展 envers 以支持此行为?

注意:我问这个问题只是因为我想知道是否可以摆脱额外的链接表并更好地理解为什么需要它。

谢谢你!


  1. 是的,您正确理解了文档中的声明
  2. 是的,但是读取“Phone”的更改历史记录将为您提供相同的后续对象(因为只有 emp_id 会更改)
  3. 不,目前无法更改此行为。除非你例如将映射更改为双向一对多关系
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Envers:单向 OneToMany 无需额外审核表? 的相关文章

随机推荐

  • 如何在Java中将HTTP状态码转换为文本?

    如何在 Java 中将 HTTP 状态代码转换为其文本表示形式 我的意思是是否有此类转换的现有实现 到目前为止我发现的最好的是java ws rs core Response Status fromStatusCode 它仅转换所有状态的有
  • C 和 C++ 中的快速 7x7 2D 中值滤波器

    我正在尝试将以下代码从 MATLAB 转换为 C function data process data data medfilt2 data 7 7 symmetric mask fspecial gaussian 35 35 12 dat
  • java中管道模式的实现

    阅读有关管道模式的信息here http parlab eecs berkeley edu wiki media patterns pipeline v1 pdf 如何在java中实现管道模式 有没有使用管道模式的开源java项目 关于 如
  • macOS 上的通用链接

    从 iOS9 开始 通用链接可以在 iOS 上使用 但我想知道 macOS 上是否有类似的东西 我们有一个应用程序 它是带有相应 Web 应用程序的 macOS 应用程序 我们希望用户单击链接在 Mac 应用程序中打开 而不是使用目标链接打
  • 如何跨多个 Pull Request 并行运行持续集成?

    我正在测试 Jenkins 的使用Github 拉取请求构建器插件 https wiki jenkins ci org display JENKINS GitHub pull request builder plugin我已经在 Githu
  • 处理已弃用的 android.text.ClipboardManager

    android text ClipboardManager自 API 级别 11 起已弃用 并替换为android content ClipboardManager source http developer android com ref
  • Tkinter:没有标题栏但可调整大小的窗口

    我知道的是 如果我想创建一个没有标题栏的窗口 我可以写 root Tk root overrideredirect 1 但我也希望窗口可以调整大小 有什么解决办法吗 仅供参考 我正在 Windows 机器上工作 尽管我不确定这是否真的重要
  • JAX-RS:如何以 JSON 形式返回对象列表?

    我查看了文档Jackson http wiki fasterxml com JacksonInFiveMinutes 这让我很困惑 我的实体看起来像 Entity Table name variable public class Varia
  • 如何绕其中心旋转 PShape?

    处理手册 第二版 中有这样的示例 17 10 PShape zig void setup size 100 100 zig createShape zig beginShape zig fill 0 zig noStroke zig ver
  • 以编程方式创建 uicollectionview 时使用自定义 init 方法

    由于 Storyboard 的限制 我正在以编程方式创建 UICollectionView 这一切正常 当我想添加一个UICollectionViewCell我执行以下操作 collectionView registerClass Cell
  • 同步调用协程

    想象一下以下非常常见的情况 您编写了一个又长又复杂的函数 并意识到一些代码应该提取到一个单独的函数中以便重用和 或可读 通常 这个额外的函数调用不会改变程序的语义 但是 现在假设您的函数是一个协程 并且您要提取的代码至少包含一个异步调用 现
  • Python 中的“元组不可调用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在尝试绘制类似以下内容时在 Python 中遇到错误 import matplotlib pyplot as plt plt plot
  • 如何在javascript中选择包含特定字符串的所有id标签?

    我有一个 ASP NET 应用程序 它可以呈现多个问题 并可以选择对给出的答案提供解释
  • AWS Lambda 公有子网 EIP 提供互联网访问

    在抱怨允许附加到 VPC 的 lambda 函数访问互联网的 NAT 网关成本时 我发现了一些关于在公共子网而不是私有子网中部署 lambda 并将 EIP 附加到由 Lambda 创建的 ENI 的建议 我也有一个连接到 VPC 的 IG
  • 如何根据表单输入值从谷歌表单获取到不同文件夹的新响应

    我有一张包含问题的表格 提单号 进口商代码 上传文件 每个用户提交回答时 文件应保存在不同的文件夹中 文件夹名称应为问题 BL编号 的输入值 我们怎样才能使它成为可能 这在很大程度上取决于您的表单的外观 这是一个如何完成的示例 假设您有一个
  • 场景大纲的设置和拆卸 (cucumber-jvm)

    我在代码中使用场景大纲 并希望在场景大纲开始之前执行一些代码 并在场景大纲执行完成后执行一些代码 我知道黄瓜中有 Before 和 After 注释 但这些注释会在每个场景之前和之后执行 因此 如果我有一个场景大纲和 3 行示例数据 那么
  • 如何在 JavaFX 中围绕自定义枢轴旋转对象?

    我想围绕自定义枢轴旋转一个对象 这就是它的重点 所以我有这样的代码 private final EventHandler
  • 根据字段值更改奏鸣曲管理包中的行颜色

    我有奏鸣曲管理包 但无法弄清楚如何根据表单模板中的字段值更改样式 例如字段难度 难度值越高 记录行的颜色应该越红 我怎样才能做到这一点 我花了几个小时来理解奏鸣曲中的树枝模板 但是我读这个模板越多 我就越感到困惑 模板之间存在块调用 并且不
  • 通过元编程将c++简化为objective-c/cocoa桥接?

    在纯 C 世界中 我们可以结合使用基于模板的编译时和运行时技术 在编译时生成不同组件或接口之间的接口或粘合代码 例如 大多数情况下自动编组到使用旧类型的调用 从调用中编组 然而 当必须将 C 应用程序与 Objective C Cocoa
  • Envers:单向 OneToMany 无需额外审核表?

    以下数据库架构 员工 EMP ID PK 姓名 工资 电话 ID PK number str OWNER ID FK Employee aud EMP ID PK REV PK FK REVTYPE 姓名 工资 Phone aud ID P