我可以将nHibernate与没有引用完整性的遗留数据库一起使用吗?

我可以将nHibernate与没有引用完整性的遗留数据库一起使用吗?,nhibernate,referential-integrity,legacy-database,Nhibernate,Referential Integrity,Legacy Database,如果我有一个没有引用完整性或键的遗留数据库,并且它使用存储过程进行所有外部访问,那么使用nHibernate持久化实体(对象图)有什么意义吗 此外,SP不仅包含CRUD操作,还包含业务逻辑 我开始认为使用自定义ado.net DAL会更容易:( 干杯 奥利你很可能可以。但你可能不应该:-) Hibernate本身并不关心引用完整性;虽然关联表之间显然需要某种链接,但实际的FK约束是否存在并不重要。例如,如果将产品映射为多对一到供应商,产品表中应该有某种类型的供应商ID,但不必是FK 根据您的SP

如果我有一个没有引用完整性或键的遗留数据库,并且它使用存储过程进行所有外部访问,那么使用nHibernate持久化实体(对象图)有什么意义吗

此外,SP不仅包含CRUD操作,还包含业务逻辑

我开始认为使用自定义ado.net DAL会更容易:(

干杯


奥利

你很可能可以。但你可能不应该:-)

Hibernate本身并不关心引用完整性;虽然关联表之间显然需要某种链接,但实际的FK约束是否存在并不重要。例如,如果将
产品
映射为
多对一
供应商
产品
表中应该有某种类型的
供应商ID
,但不必是FK

根据您的SP签名,您可以将它们用作映射中的自定义CRUD,也可以不用作自定义CRUD;如果SP中确实包含在所有CRUD操作期间应用的业务逻辑,那么这可能是您的第一个潜在问题


最后,如果您的SP确实用于所有CRUD操作(包括所有可能的查询),那么尝试将Hibernate引入组合可能不值得-您将几乎一无所获,您将需要处理另一个层。

好的,问题的一个示例是:

SP使用类似于以下内容的sql语句选择下一个要插入到表的“Id”列中的Id(此列只是一个int列,但不是标识列)

声明:“从客户中选择@cus_id=max(id)+1”

因此,一旦计算出下一个id,它将与其他数据一起插入表A,然后将一行插入表B,其中表A的另一列上有表A的引用(无外键约束),最后将一行插入表C,使用表A的相同引用

当我使用fluent NH将其映射到NH时,映射为第一个表生成了正确的“插入”sql语句,但当第二个表映射为“引用”时,生成了“更新”sql语句,我希望看到“插入”语句

现在,事实上没有标识列,没有键,也没有引用完整性,这对我来说意味着我不能保证关系是一对一,一对多等等

如果这是真的,如何配置NH(fluent)或

干杯


Ollie

也没有主键?没有键,没有索引,没有标识列,没有外键约束-这几乎是我见过的最糟糕的遗留数据库之一,我不想更改数据库中的任何内容,因为我害怕破坏我不知道或无法控制的东西…:)您似乎混淆了db约束/id生成和Hibernate映射。您确实需要在Hibernate中映射ID;但它们不必依赖于标识列(例如,您可以使用“已分配”或“增量”生成器),Hibernate也不关心PK/FK约束。也就是说,选择下面所示的max(id)是非常有问题的,除非您能够保证执行顺序(如果不保证,您迟早会从并发事务中获得id冲突)。我知道使用“select max(id)”的问题。至于NH上的混淆,我知道您可以为标识列指定“已分配”或“增量”生成器。我感到困惑的是,通常情况下(文档建议)使用“References”而不是“HasOne”,而当我这样做时,为什么它会为与初始insertI相关的表生成“update”语句而不是“insert”语句?我是Hibernate用户,所以这里的术语可能有点不连贯。“HasOne”是指嵌入式/组件?这将映射到同一个表,因此在这里不相关。Hibernate发出更新而不是插入的可能原因是(a)您的关联映射错误;或者(b)b/C实体上的ID映射不正确,导致Hibernate假设实体已经存在(这种情况经常发生在“已分配”的生成器上)。好吧,我现在不了解代码,但听起来好像“已分配”的生成器有问题。感谢您提供的信息,当我明天在代码中时,我将尝试提供一个示例。此外,我确实理解NH中“组件”的含义