2

HSQLDB + Hibernate を使用して、開発中のアプリケーションの単体テストを実行しています。他のエンティティとの 3 つの OneToOne 関係を持つエンティティを永続化するテストがあります。MySql を使用してテストを実行すると、エラーは発生せず、テストはパスしますが、HSQLDB に対して同じテストを実行すると、java.sql.SQLException: Integrity constraint violation - no parent FK_...が FK_ の 1 つであるというエラーが発生します。 Person クラスの関係で定義された外部キー。

私のコードは次のとおりです。

@Entity
@Table(name = "PERSON")
public class Person {

    private static final long serialVersionUID = 1L;

    private Long oid;
    private Address commercialAddress;
    private Address homeAddress;
    private Settings settings;

    @Id
    @GeneratedValue
    @Column(name = "OID")
    public Long getOID() {
        return this.oid;
    }

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "COMPANY_ADDRESS_OID", nullable = false)
    @ForeignKey(name = "FK_PERSON__COMPANY_ADDRESS")
    public Address getCommercialAddress() {
        return this.commercialAddress;
    }

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "HOME_ADDRESS_OID", nullable = false)
    @ForeignKey(name = "FK_PERSON__HOME_ADDRESS")
    public Address getHomeAddress() {
        return this.homeAddress;
    }

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "SETTINGS_OID", nullable = false)
    @ForeignKey(name = "FK_PERSON__SETTINGS")
    public Settings getSettings() {
        return this.settings;
    }
}

Address クラスと Settings クラスには関係がなく、単純な休止状態のエンティティです。

@Entity
@Table(name = "ADDRESS")
public class Address {
    private Long oid;
    private String city;
    private String country;
    private String province;
    private String postalCode;
    private String street;

    @Id
    @GeneratedValue
    @Column(name = "OID")
    public Long getOID() {
        return this.oid;
    }

    ...
}

@Entity
@Table(name = "Settings")
public class Settings {
    private Long oid;
    private String backgroundColor;
    private String fontName;
    private Integer fontSize;
    private String themeName;

    @Id
    @GeneratedValue
    @Column(name = "OID")
    public Long getOID() {
        return this.oid;
    }

    ...
}

Google を使用していくつかの検索を実行しましたが、有用なものが見つかりませんでした。誰かが私を正しい方向に向けてくれることを願っています。前もって感謝します。

4

0 に答える 0