GROM使用多对多映射创建不必要的表

时间:2013-06-01 04:21:50

标签: java hibernate grails gorm

我有关于多对多映射的问题。

[案例]

  • 帐户拥有社区(所有者)
  • 社区有许多帐户(成员)

GORM创建了四个表:

  • 帐户
  • 社区
  • COMMUNITY_MEMBERS
  • COMMUNITY_OWNER

GORM创建表“COMMUNITY_OWNER(ACCOUNT_ID,OWNER_ID)”。为什么GORM创造了这个?

未使用此表。(请查看Hibernate日志)我希望GORM不创建COMMUNITY_OWNER。我的映射错了?

相关问题:cascade delete with many-to-many mapping in Grails

[域类]

class Account {

  String name

  static hasMany = [communities: Community]
  static belongsTo = [Community]
}

class Community {

  String name
  Account owner

  static hasMany = [members: Account]

  static mapping = {
    owner cascade: 'none'
  }
}

[TestCode]

def admin = new Account(name: 'admin').save(flush:true)
def user = new Account(name: 'user').save(flush:true)

def c = new Community(name: 'TestCommunity')

c.owner = admin

c.addToMembers(admin)
c.addToMembers(user)            
c.save(flush:true)

c.removeFromMembers(user)
c.save(flush:true)

c.delete(flush:true)

[休眠日志]

INFO  hbm2ddl.SchemaExport  - Running hbm2ddl schema export
DEBUG hbm2ddl.SchemaExport  - import file not found: /import.sql
INFO  hbm2ddl.SchemaExport  - exporting generated schema to database
DEBUG hbm2ddl.SchemaExport  - drop table account if exists
DEBUG hbm2ddl.SchemaExport  - drop table community if exists
DEBUG hbm2ddl.SchemaExport  - drop table community_members if exists
DEBUG hbm2ddl.SchemaExport  - drop table community_owner if exists
DEBUG hbm2ddl.SchemaExport  - create table account (id bigint generated by default as identity, version bigint not null, name varchar(255) not null, primary key (id))
DEBUG hbm2ddl.SchemaExport  - create table community (id bigint generated by default as identity, version bigint not null, name varchar(255) not null, owner_id bigint not null, primary key (id))
DEBUG hbm2ddl.SchemaExport  - create table community_members (community_id bigint not null, account_id bigint not null, primary key (community_id, account_id))

<<Why create?>> 
DEBUG hbm2ddl.SchemaExport  - create table community_owner (account_id bigint not null, owner_id bigint not null)

DEBUG hbm2ddl.SchemaExport  - alter table community add constraint FKA7C52FE92BBE477B foreign key (owner_id) references account
DEBUG hbm2ddl.SchemaExport  - alter table community_members add constraint FK5A8DA6C3C4A6EE81 foreign key (community_id) references community
DEBUG hbm2ddl.SchemaExport  - alter table community_members add constraint FK5A8DA6C398BAC5C1 foreign key (account_id) references account
DEBUG hbm2ddl.SchemaExport  - alter table community_owner add constraint FK12E232DD98BAC5C1 foreign key (account_id) references account
DEBUG hbm2ddl.SchemaExport  - alter table community_owner add constraint FK12E232DD8BE4BF77 foreign key (owner_id) references community
INFO  hbm2ddl.SchemaExport  - schema export complete

<<community_owner not used>>
DEBUG hibernate.SQL  - insert into account (id, version, name) values (null, ?, ?)
DEBUG hibernate.SQL  - insert into account (id, version, name) values (null, ?, ?)
DEBUG hibernate.SQL  - insert into community (id, version, name, owner_id) values (null, ?, ?, ?)
DEBUG hibernate.SQL  - update account set version=?, name=? where id=? and version=?
DEBUG hibernate.SQL  - update account set version=?, name=? where id=? and version=?
DEBUG hibernate.SQL  - insert into community_members (community_id, account_id) values (?, ?)
DEBUG hibernate.SQL  - update account set version=?, name=? where id=? and version=?
DEBUG hibernate.SQL  - update community set version=?, name=?, owner_id=? where id=? and version=?
DEBUG hibernate.SQL  - delete from community_members where community_id=? and account_id=?
DEBUG hibernate.SQL  - delete from community_members where community_id=?
DEBUG hibernate.SQL  - delete from community where id=? and version=?

1 个答案:

答案 0 :(得分:1)

查看您的映射,我相信您的情况稍微偏离(以及映射)。你的意思是说......

  

帐户有很多社区(作为“社区”)
  社区有许多帐户(作为“成员”)

这将是真正的多对多。同样从你的映射,我假设你喜欢Account作为多对多的拥有方。如果是这种情况,那么您可以执行以下操作。

class Account {
 ..
 static hasMany = [communities: Community]
 static mappedBy = [communities: 'owner']  //<-- will not work without this mapping
} 

class Community {
 ..
 static belongsTo = [owner: Account] //<-- assumes Account is owner
 static hasMany = [members: Account]
}

注意:社区中的belongsTo假定帐户将是“所有者”。需要mappedBy,否则Grails会爆炸(这里是discussion about it)。

您最终会得到帐户和社区表以及第三个映射表 - 没有第四个表。

  • 映射表将处理社区“有很多成员”的关系
  • 帐户“有多个社区”关系由社区表上的外键处理回帐户。