9

次のデータベース スキーマ:

社員[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]

Employee_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 Developerguide で、次のテキストを見つけました。

これら 2 つの (@OneToMany+@JoinColumn) アノテーションを使用してコレクションがマップされると、Hibernate は結合テーブルを生成しません。ただし、関連するエンティティが変更されたリビジョンを読み取るときに、誤った結果が得られないように、Envers はこれを行う必要があります。

これは、このテキストの私の解釈です: 私の従業員エンティティは、多くの電話エンティティに属している可能性があります。たとえば、電話を特定の従業員に追加すると、従業員が変更されるため、監査エントリを作成する必要があります。上記のマッピングを使用すると、従業員ではなく電話エンティティの監査エントリになります。この問題は、リンク テーブルを使用して解決されます (このテーブルは、従業員が所有する電話コレクション内の変更を説明するため)。

ここで、私の 3 つの質問: - 上記の説明を正しく理解しているか、何か特別なことが抜けているか? - Envers がこのリンク テーブルを作成しなかった場合、phone_aud テーブルを参照することでこれらの関係を追跡することもできます。これは本当ですか?- この動作をサポートするために、envers を構成/拡張することは可能ですか?

注: 余分なリンク テーブルを取り除くことができるかどうか、またそれが必要な理由をよりよく理解することができるかどうかを知りたいという理由だけで、質問をしています。

ありがとうございました!

4

2 に答える 2