エージェントの階層を格納するテーブルがあります。
create table agent (
agent_id int not null,
agent_name varchar(255),
agent_parent_id,
constraint pk_agent primary key (agent_id));
alter table agent
add constraint fk_agent_agent foreign key (agent_parent_id) references (agent_id);
私はそれを次のようにモデル化しました:
class Agent {
String agentName
Agent agentParent
static mapping = {
id column: 'agent_id'
id generator: 'sequence', params: [sequence: 'agent_id_seq']
}
}
各エージェントには多くのプロパティがあります。
create table agent_property (
agent_property_id int not null,
agent_property_name varchar(255),
agent_id int,
constraint pk_agent_property primary key (agent_property_id));
alter table agent_property (
add constraint fk_agent_property_agent foreign key (agent_id) references agent(agent_id);
私はそれを次のようにモデル化しました:
class AgentProperty {
String agentPropertyName
static hasOne = [agent: Agent]
static mapping = {
id column: 'agent_property_id'
id generator: 'sequence', params: [sequence: 'agent_property_id_seq']
}
}
エージェントの階層を簡単に確認できるビューを作成しました。
create view pathogen as
select c.agent_id as id, a.agent_name as genus, b.agent_name as species, c.agent_name as strain, d.agent_name as toxin
from agent a
left join agent b on a.agent_id = b.agent_parent_id
left join agent c on b.agent_id = c.agent_parent_id
left join agent d on c.agent_id = d.agent_parent_id
where a.agent_parent_id is null;
私の問題は、病原体のビューをモデル化することです。私はこれをやった:
class Pathogen {
String genus
String species
String strain
String toxin
static hasMany = [agentProperties: AgentProperty]
}
これは、agent_property テーブルに外部キー「pathogen_id」があることを意味します。しかし、そうではありません。外部キーは agent_id です。制約があるかのように、AgentProperty を agent_id の Pathogen に関連付けたいと思います。
alter table agent_propery
add constraint fk_agent_property_pathogen foreign key (agent_id) references pathogen (id);
次のように、暗黙のプロパティagentPropertiesをPathgeonクラスのagent_idにマップしようとしました:
static mapping = {
agentProperties column: agent_id // or AgentProperty.agent
}
しかし、それはうまくいきませんでした。
GORM に agent_property.agent_id を外部キーとして使用するように指示するにはどうすればよいですか?