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;