【问题标题】:Problem using Hibernate and SQL Server 2008使用 Hibernate 和 SQL Server 2008 的问题
【发布时间】:2011-03-10 17:38:04
【问题描述】:

我在使用 Hibernate 和 SQL Server 2008 时遇到问题。当我尝试将对象保存到数据库时,Hibernate 会抛出以下错误:

could not retrieve snapshot: com.my.MyClass

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name `'emanagement.patient_visit'.`

用户在数据库中具有选择、插入、更新权限。所以我排除了这个问题。

这是生成的 SQL:

select
        patientvis_.account_number,
        patientvis_.status as status1_,
        patientvis_.cpt_code as cpt3_1_,
        patientvis_.locked as locked1_,
        patientvis_.state as state1_,
        patientvis_.userid as userid1_ 
    from
        emanagement.patient_visit patientvis_ 
    where
        patientvis_.account_number=?

如果我在 SQL Server 中运行上述 SQL,它会显示无效的对象名称 emanagement.patient_visit,但如果我手动添加“dbo”emanagement.dbo.patient_visit,它将被执行。

那么我还需要进行其他 Hibernate 配置吗?

这是我的 Hibernate 映射。下面的映射在 MySQL 下工作。我可以读取和更新数据库中的 patient_visit。但是当切换到 MS 服务器时它会失败。 我已经尝试过其他适用于 MySQL 和 MS Server 的休眠映射,它们都使用如下相同的声明,如 table="db_table" schema="my_database"。 唯一的区别是我在 MS Server 下创建了这个新的电子管理数据库,所以我认为我错过了 MS Server 管理工具上的一些特定数据库配置。 证明这一点的唯一方法是让我将新表从 emanagement 移动到现有数据库中,看看它是否有效。

<class name="com.domain.patient.model.PatientVisit" table="patient_visit"    schema="emanagement">
        <id name="accountNumber" type="java.lang.Long">
            <column name="account_number" precision="22" scale="0" />
            <generator class="assigned"/>
        </id> 
        <property name="status" type="string">
            <column name="status"/>
        </property>
        <property name="cptCode" type="string">
            <column name="cpt_code"/>
        </property> 
        <property name="locked" type="boolean">
            <column name="locked" precision="1" scale="0"/>
        </property>  
        <property name="state" type="string">
            <column name="state"/>
        </property>  
        <property name="userId" type="string">
            <column name="userid"/>
        </property>  
               <set name="documents" lazy="false">
            <key column="account_number"/>
            <one-to-many class="com.domain.document.model.Document"/>
        </set>     
    </class>

提前致谢。

【问题讨论】:

    标签: java sql-server database hibernate


    【解决方案1】:

    那么我还需要进行其他 Hibernate 配置吗?

    根据您当前的设置,我想您必须指定架构。例如,在映射中:

    <class name="Users" table="Users" schema="dbo" catalog="suiteaccess">
    

    但您也可以使用hibernate.default_schema 属性指定默认架构(请参阅3.4. Optional configuration properties)。

    以防万一,您可以create your own schema

    【讨论】:

    • 以 Pascal 的回答为基础,看起来您可能已经在配置中指定了架构名称应位于的数据库名称。我见过的大多数 ORM 不使用 3 部分命名方案进行访问,所以我不得不想象这是一个错误配置。
    • 这很奇怪,因为我有其他休眠对象映射,它们被正确保存到 SQL Server。但对于那些我正在使用 Spring Framework 的人。
    • @Strommy @Marquinio 看看休眠配置(可能还有两个代表性实体的映射)会很有趣。
    • 我发布了导致 MS Server 出现问题的休眠映射。我知道在处理不同的项目时,这种相同的休眠映射样式也适用于 MS Server。
    • @Marquinio:正如我所写,schema 应该是 dboemanagementcatalog
    【解决方案2】:

    将架构更改为 dbo。在 SQL Server 中,模式是数据库中的容器,而不是数据库本身。这在 MySQL 中可能有所不同,但在这种情况下,您的架构应该是 dbo(基于您对它的评论,如果您将“dbo.”添加到结果查询中。

    谢谢, 埃里克

    【讨论】:

      【解决方案3】:

      将以下配置放入映射文件。它解决了无效对象异常。

      <class name="Users" table="databaseName.dbo.Users">
      

      把上面那行改成映射文件。它应该是工作。因为 Mssql 服务器具有默认架构 (dbo)。这就是为什么要使用完全分类的表名。

      【讨论】:

      • 发帖前请记得先看预览。如果添加代码,则应在代码前添加 4 个空格。欢迎来到 Stack 希望你会喜欢它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多