如果我有一个没有参照完整性或密钥的遗留数据库,并且它使用存储过程进行所有外部访问,那么使用nHibernate来持久保存实体(对象图)是否有任何意义?
另外,SP不仅包含CRUD操作,还包含业务逻辑......
我开始认为坚持使用自定义ado.net DAL会更容易:(
干杯
奥利
答案 0 :(得分:1)
你很可能 CAN 。但你可能不应该: - )
Hibernate本身并不关心参照完整性;虽然它显然需要在关联的表之间建立某种联系,但是否存在实际的FK约束并不重要。例如,如果Product
被映射为many-to-one
到Vendor
,则PRODUCTS
表中应该包含某种VENDOR_ID
,但不一定是一个FK。
根据您的SP签名,您可能会或可能无法在映射中将它们用作自定义CRUD;如果SP确实具有在所有CRUD操作期间应用的业务逻辑,那么这可能是您的第一个潜在问题。
最后,如果你的SP确实用于所有 CRUD操作(包括所有可能的查询),那么尝试将Hibernate引入混合可能是不值得的 - 你几乎什么都得不到你将有另一层要处理。
答案 1 :(得分:0)
SP使用类似于以下内容的sql语句来选择要插入表的“Id”列的下一个Id(此列只是一个int列,但不是标识列),
声明:'从客户'中选择@cus_id = max(id)+ 1,
所以一旦计算出下一个id,它就会插入到表A中,并带有其他数据,然后在表B中插入一行,其中表A中的另一列上有表A(没有外键约束),最后是使用与表A相同的ref将行插入表C中。
当我使用流畅的NH将其映射到NH时,映射为第一个表生成了正确的'insert'sql语句,但是当第二个表被映射为'Reference'时,生成了'update'sql语句,我是期待看到'插入'声明......
现在事实上没有标识列,没有密钥,没有参考完整性意味着我不能保证关系是一对一,一对多等...
如果这是真的,NH(流利的)如何配置......
干杯
Ollie