我在搜索所有搜索字词的Google搜索结果时遇到问题;太多的信息关闭但不是我正在寻找的信息,所以......关闭StackOverflow!
我有三个表,Stocks
,StockProperties
和StockPropertyTypes
。
一个Stock
条记录与之关联的零个或多个StockProperties
,并且具有唯一的列symbol
。每个StockProperty
记录只有一个StockPropertyType
的引用,以及对Stock
的一个引用。 StockPropertyTypes
表格具有唯一列code
。这些表的实体没有引用的FK id,只有类。例如,StockProperty
实体看起来像:
public class StockProperty
{
public virtual Guid StockPropertyId { get; set; }
public virtual Stock Stock { get; set; }
public virtual string PropertyValue { get; set; }
public virtual StockPropertyType Type { get; set; }
}
我想将库存符号,类型代码和值传递给方法,并使用HQL创建StockProperty
记录,但我不确定如何编写该查询。 Stocks
表和StockPropertyTypes
没有任何关系。看起来这应该是一些嵌套的HQL查询,但我不确定如何区分属性和被引用的实体。
有人可以告诉我HQL查询应该是什么样的吗?
我应该补充一点,我的目标是通过一次db旅行来做到这一点;我不想在创建Stock
记录之前加载StockPropertyType
和StockProperty
个实体。
答案 0 :(得分:1)
执行此操作的典型方法是从StockPropertyType
加载ISession
和StockProperty
。然后使用ISession.Save()
创建session
.CreateSQLQuery(@"insert
into StockProperty(StockSymbol, Value, TypeCode)
values (:stockSymbol, :value, :typeCode)")
.SetProperty("stockSymbol", stockSymbol)
.SetProperty("value", value)
.SetProperty("typeCode", typeCode)
.ExecuteUpdate();
以保存。
正如您所提到的,这需要一些额外的数据库访问。避免这种情况的一种方法是直接执行SQL,如下所示:
Stock
你在这里绕过NHibernate,但效率更高。
就个人而言,我会考虑将相关实体加载到内存中,除非您遇到瓶颈。您可以使用StockPropertyType
范例在单个数据库调用中同时加载Future<T>()
和<sql-insert>
。
<强> 另外... 强>
您可以尝试在hibernate映射文件中摆弄StockId
。这使您可以更好地控制插入的生成方式。您可能希望添加仅在StockPropertyTypeId
期间使用的一些属性insert
和{{1}}。