0

Grailsでは、ドメインクラスを「interface」という名前の外部キー列を持つデータベーステーブルにマップすることは不可能のようです。私の場合、2つのテーブルINTERFACEとINTERFACE_DETAILSとの関係があります。これらはレガシーデータベースであり、列名を変更または追加することはできません。

簡単に言えば、INTERFACE_DETAILSには、PKINTERFACE.IDを参照するFK列「INTERFACE」があります。

class Interface {
    String id;  

    static mapping = {
        table "INTERFACE"
        version false
        id generator: 'assigned'
        id column: 'id', sqlType:"varchar2(20)"
    }

class InterfaceDetails {

    Interface iface;    
    static belongsTo = [iface: Interface]

    static mapping = {
        table "INTERFACE_DETAILS"
        version false        
        id column: 'interface'
        iface column: 'INTERFACE', sqlType:"varchar2(20)", insertable: false, updateable: false
    }
}

現在、H2データベースを使用しています。InterfaceDetailsに行を追加しようとすると、このエラーが発生します。

参照整合性制約違反: "FK351396597E3917F9:PUBLIC.INTERFACE_DETAILS FOREIGN KEY(INTERFACE)REFERENCES PUBLIC.INTERFACE(ID)"; SQLステートメント:INTERFACE_DETAILS(インターフェイス)値に挿入(null)[23506-164]

なぜhibernateが'interface'値にnullを追加するのだろうか?

次の行が必要です: "id column:'interface'"他の場合、Hibernateは追加の列 "iface_id"を生成し、これは適切ではありません。既存のデータベース列は変更できません。

これはかなり不可解です。Grailsはこの状況に対処できることを教えてください。

スキーマを削除しました:

create table interface (id varchar2(20) not null,primary key (id));
create table interface_details (interface varchar2(20) not null, name varchar(255) not null, primary key (interface));
alter table interface_details add constraint FK_INTERFACE foreign key (interface) references interface;
4

0 に答える 0