7

エージェントの階層を格納するテーブルがあります。

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 を外部キーとして使用するように指示するにはどうすればよいですか?

4

2 に答える 2

8

私の元の問題の解決策は、agent_id を引用符で囲んでいなかったことです。

agentProperties column: 'agent_id'

これは今動作します:

class Pathogen {
  String genus
  String species
  String strain
  String toxin

  static hasMany = [agentProperties: AgentProperty]

  static mapping = {
    // use agent_id to releate to AgentProperty
    agentProperties column: 'agent_id'
  }
}

class AgentProperty {
  String agentPropertyName

  static belongsTo = [agent: Agent]
  static hasOne = [pathogen: Pathogen]

  static mapping = {
    id column: 'agent_property_id'
    id generator: 'sequence', params: [sequence: 'agent_property_id_seq']
    // use agent_id to relate to Pathogen
    pathogen column: 'agent_id', insertable: false, updateable: false
  }
}
于 2013-06-20T18:07:49.863 に答える
1

ドメインクラスは、データベースにある設計に固執するために少し変更する必要があります.

class Agent {
  String agentName
  Agent agentParent

  //agent_id Foreign Key to AgentProperty. Agent has many AgentProperties
  static hasMany = [agentProperties: AgentProperty] 

  static mapping = {
    id column: 'agent_id'
    id generator: 'sequence', params: [sequence: 'agent_id_seq']
  }
}

class AgentProperty {
  String agentPropertyName

  //AgentProperty belongs to an Agent. Cascade delete is enabled
  static belongsTo = [agent: Agent]
  static mapping = {
    id column: 'agent_property_id'
    id generator: 'sequence', params: [sequence: 'agent_property_id_seq']
  }
}

class Pathogen {
  String genus
  String species
  String strain
  String toxin

  //like foreign key pathogen_id in agent table
  static hasMany = [agents: Agent]
}

経由でAgentPropertyから入手できます。PathogenAgent

あなたの質問を正しく読めば、これがあなたが必要としているものです。

Pathogen hasMany Agents
Agent hasMany AgentProperty
于 2013-06-18T21:57:14.970 に答える