我正在开发基于Web的应用程序来替换基于桌面的应用程序。我需要让他们都在同一个数据库上工作。对于基于Web的应用程序,我使用GWT和Hiberate(与Gilead),运行在Tomcat 7.0上。 SQL服务器是MSSQL 2000设置休眠以通过查看数据库来获取下一个密钥
我得到异常:
com.microsoft.sqlserver.jdbc.SQLServerException:PRIMARY KEY约束 'PK_CallLog' 的相关规定。不能在对象'CallLog'中插入重复键。
为了让我做以下步骤除外:
- 添加通话记录与旧的应用程序
- 添加呼叫纪录(使用Hibernate)的新的应用程序。
看来,hibernate使用自己的缓存,而不是看着数据库来找出下一个主键应该是什么。
有没有办法通过查看数据库强制hibernate获取下一个密钥?
这是呼叫记录的映射:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hib.....dtd">
<hibernate-mapping>
<class name="com.asi.shared.Call" table="CallLog">
<id name="id" column="callid">
<generator class="increment"/>
</id>
<property name="caller"/>
<property name="callDate" column="calldate"/>
.... other props ....
<property name="checkOut" column="checkout"/>
<many-to-one name="customer" class="com.asi.shared.Customer"
column="customerid" not-found="ignore"/>
</class>
</hibernate-mapping>
这是我使用添加一个新的调用方法:
public Integer saveCall(Call call){
DebugLog.print("HelpDeskServiceImpl.saveCall(call)");
Session session = gileadHibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
check(session);
session.saveOrUpdate(call);
session.getTransaction().commit();
return call.getId();
}
架构的通话记录:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CallLog]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[CallLog]
GO
CREATE TABLE [dbo].[CallLog] (
[callid] [int] NOT NULL ,
[caller] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[calldate] [datetime] NULL ,
.... other columns ....
[checkout] [varchar] (5) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
我想尽量避免更改数据库,我不想打破旧的应用程序。
我采用了第一种策略。只有大约20人会使用它,所以我不认为它会是一个问题,最终遗留的应用程序将被淘汰,所以我会把它切换回来。谢谢您的帮助! – Angel