试图进行多对多关联.
到目前为止我所拥有的是:
namespace com.example // Assembly = com.example { public class Foo { public virtual long Id { get; set; } public virtual IDictionary<string,ISet<PersistentClass>> MappedCollections { get; set; } } public class PersistentClass { public virtual long Id { get; protected set; } public virtual string Prop { get; set; } } }
这是我的映射:
<?xml version="1.0" encoding="utf-8"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="com.example.Foo,com.example"> <id name="Id" type="Int64" generator="hilo" /> <map name="MappedCollections"> <key column="Id" /> <index column="Key" type="String" /> <many-to-many class="com.example.PersistentClass,com.example" /> </map> </class> <class name="com.example.PersistentClass,com.example"> <id name="Id" type="Int64" generator="hilo" /> <property name="Prop" /> </class> </hibernate-mapping>
if exists (select 1 from sys.objects where object_id = OBJECT_ID(N'[FKC8D94E45A4783B9]') AND parent_object_id = OBJECT_ID('MappedCollections')) alter table MappedCollections drop constraint FKC8D94E45A4783B9 if exists (select 1 from sys.objects where object_id = OBJECT_ID(N'[FKC8D94E46534DBE0]') AND parent_object_id = OBJECT_ID('MappedCollections')) alter table MappedCollections drop constraint FKC8D94E46534DBE0 if exists (select * from dbo.sysobjects where id = object_id(N'Foo') and OBJECTPROPERTY(id,N'IsUserTable') = 1) drop table Foo if exists (select * from dbo.sysobjects where id = object_id(N'MappedCollections') and OBJECTPROPERTY(id,N'IsUserTable') = 1) drop table MappedCollections if exists (select * from dbo.sysobjects where id = object_id(N'PersistentClass') and OBJECTPROPERTY(id,N'IsUserTable') = 1) drop table PersistentClass if exists (select * from dbo.sysobjects where id = object_id(N'hibernate_unique_key') and OBJECTPROPERTY(id,N'IsUserTable') = 1) drop table hibernate_unique_key create table Foo ( Id BIGINT not null,primary key (Id) ) create table MappedCollections ( Id BIGINT not null,elt BIGINT not null,Key NVARCHAR(255) not null,primary key (Id,Key) -- !! WRONG !! should be unique (Id,elt,Key) ) create table PersistentClass ( Id BIGINT not null,Prop NVARCHAR(255) null,primary key (Id) ) alter table MappedCollections add constraint FKC8D94E45A4783B9 foreign key (elt) references PersistentClass alter table MappedCollections add constraint FKC8D94E46534DBE0 foreign key (Id) references Foo create table hibernate_unique_key ( next_hi BIGINT ) insert into hibernate_unique_key values ( 1 )
知道我做错了什么吗?从我们的sql中,我们可以看到它持久化为IDictionary< string,PersistentClass>而不是IDictionary< string,ISet< PersistentClass>,我不希望许多Foo与多对字符串和Persistent类的多对多关系,其中该对对于每个Foo是唯一的.所有三个值都应创建唯一值.
我怎样才能做到这一点?
(注意:我包含了Hibernate标签,因为无论是Hibernate还是NHibernate,这种关系的xml映射应该是相同的)
解决方法
虽然它创建了一个不必要的连接,但是创建另一个实体可以做到这一点,同时保持一个非常相似
基本上:
namespace com.example // Assembly = com.example { public class Foo { public virtual long Id { get; set; } public virtual ReadOnlyDictionary<string,ISet<PersistentClass>> MappedCollections { get { return new ReadOnlyDictionary<string,ISet<PersistentClass>>(_mc); } } protected virtual IDictionary<string,PersistentClassSet> _mc { get; set; } public virtual void InitializeCollection(string key) { if (!_mk.ContainsKey(key)) _mc[key] = new PersistentClassSet(); } } public class PersistentClass { public virtual long Id { get; protected set; } public virtual string Prop { get; set; } } internal class PersistentClassSet : ISet<PersisitentClass> { public PersistentClassSet() { Proxy = new HashSet<PersistentClass>(); } protected virtual long Id { get; set; } protected virtual ISet<PersistentClass> Proxy { get; set; } public bool Add(PersistentClass item) { return Proxy.Add(item); } // other ISet implementations delegated to Proxy } }
映射如下:
<?xml version="1.0" encoding="utf-8"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="com.example.Foo,com.example"> <id name="Id" type="Int64" generator="hilo" /> <map name="MappedCollections"> <key column="Id" /> <index column="Key" type="String" /> <many-to-many class="com.example.PersistentClassSet,com.example"> <id name="Id" type="Int64" generator="hilo" /> <property name="Prop" /> </class> <class name="com.example.PersistentClassSet,com.example"> <id name="Id" type="Int64" generator="hilo" /> <set name="Proxy"> <key column="Id"/> <many-to-many class="com.example.PersistentClass,com.example" /> </set> </class> </hibernate-mapping>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。