我在使用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 Server时失败。我已经尝试了其他适用于MySQL和MS Server的hibernate映射,它们都使用如下相同的声明,例如table =“ db_table” schema =“ my_database”。唯一的区别是,我在MS Server下创建了这个新的管理数据库,因此我认为我错过了MS Server管理工具上的某些特定数据库配置。证明这一点的唯一方法是对我来说,将新表从管理转移到现有数据库,并查看其是否有效。
<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>
提前致谢。
在当前设置下,我想您必须指定架构。例如,在映射中:
<class name="Users" table="Users" schema="dbo" catalog="suiteaccess">
但是,您也可以使用hibernate.default_schema属性指定默认架构(请参见3.4。可选配置属性)。
hibernate.default_schema