我是NHibernate的新手,我发现问题映射两个表关系。
我在SQL Server数据库中有两个表cafe_table
和cafe_table_group
。它们都有自动增量和标识列,用于其唯一ID。
虽然表格中显示foreign key
,但我没有。
这是我的cafe_table.hbm.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="CafePOS" namespace="CafePOS" xmlns="urn:nhibernate-mapping-2.2">
<class name="CafePOS.CafeTable" table="cafe_table" lazy="true" >
<id name="cafe_table_id" column="cafe_table_id">
<generator class="identity" />
</id>
<property name="cafe_table_group_id">
<column name="cafe_table_group_id" sql-type="decimal" not-null="false" />
<many-to-one name="cafe_table_group" class="CafePOS.CafeTableGroup" column="cafe_table_group_id" fetch="select"/>
</class>
</hibernate-mapping>
我的cafe_table.hbm.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="CafePOS" namespace="CafePOS" xmlns="urn:nhibernate-mapping-2.2">
<class name="CafePOS.CafeTableGroup" table="cafe_table_group" lazy="true" >
<id name="cafe_table_group_id" column="cafe_table_group_id">
<generator class="identity" />
</id>
<set name="cafe_table" table="`cafe_table`">
<key column="cafe_table_group_id"/>
<one-to-many class="CafePOS.CafeTable" fetch="select"/>
</set>
</class>
</hibernate-mapping>
cafe_table
与many-to-one
cafe_table_group
上的cafe_table_group_id
关系cafe_table_group
,one-to-many
与cafe_table
的关系 public class CafeTable {
public virtual decimal cafe_table_id { get; set; }
public virtual decimal cafe_table_group_id { get; set; }
public virtual CafeTableGroup cafe_table_group { get; set; }
}
}
。< / p>
我的模型CafeTable类: namespace CafePOS {
namespace CafePOS {
public class CafeTableGroup {
public virtual decimal cafe_table_group_id { get; set; }
public virtual string cafe_table_group_name { get; set; }
public virtual IList<CafeTable> cafe_table { get; set; }
}
}
我的CafeTableGroup模型类:
A <- c("a","b","c","d")
B <- c("i","","k","l")
C <- c("m","j","o","p")
D <- c("","o","","")
df <- data.frame(A,B,C,D, stringsAsFactors = FALSE)
df[2,2:3] <- df[2,3:4]
#remove column D
df <- df[,1:3]
> df
A B C
1 a i m
2 b j o
3 c k o
4 d l p
我只希望SELECT语句的这种关系类似于SQL查询中的INNER JOIN。
答案 0 :(得分:1)
在子表中,我们应该将引用映射为可编辑,并将其ID映射为只读
<class name="CafePOS.CafeTable" table="cafe_table" lazy="true" >
<id name="cafe_table_id" column="cafe_table_id">
<generator class="identity" />
</id>
<property name="cafe_table_group_id" insert="false" update="false">
<column name="cafe_table_group_id" sql-type="decimal" not-null="false" />
</property>
<many-to-one name="cafe_table_group"
class="CafePOS.CafeTableGroup"
column="cafe_table_group_id" fetch="select"/>
...
父母应该有没有fetch
模式的集合 - 而且,应该使用级联...
<class name="CafePOS.CafeTableGroup" table="cafe_table_group" lazy="true" >
<id name="cafe_table_group_id" column="cafe_table_group_id">
<generator class="identity" />
</id>
...
<!--<set name="cafe_table" table="`cafe_table`">-->
<set name="cafe_table" table="`cafe_table`" cascade="all-delete-orphan" >
<key column="cafe_table_group_id"/>
<!--<one-to-many class="CafePOS.CafeTable" fetch="select"/>-->
<one-to-many class="CafePOS.CafeTable" />
</set>
现在分配双方
var parent = ...;
var child = ...;
parent.cafe_table.Add(child);
child.cafe_table_group = parent;
// this will be enough.. because cascade will do the rest in proper order
session.SaveOrUpdate(parent);
以下是更详细的说明如何处理: