2010-06-08 58 views
1

我正在构建数据仓库并希望使用InfiniDB作为存储引擎。但是,它不允许使用主键或外键约束(或对此有任何约束)。休眠没有主键生成的数据库?

Hibernate抱怨当我执行插入操作时,“数据库没有返回本地生成的标识值”。

每个表都是关系型的,并且包含一个以前用作主键的唯一整数列 - 我想保留这一点,但是没有db中的约束条件,即该列是主键。

我假设问题是Hibernate希望数据库返回一个生成的密钥。是否有可能重写这种行为,所以我可以自己设置主键字段的值,并保持休眠快乐?

- 编辑 -

映射的两个如下:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Jun 1, 2010 2:49:51 PM by Hibernate Tools 3.2.1.GA --> 
<hibernate-mapping> 
<class name="com.example.project.Visitor" table="visitor" catalog="orwell"> 
    <id name="id" type="java.lang.Long"> 
    <column name="id" /> 
    <generator class="identity" /> 
    </id> 
    <property name="firstSeen" type="timestamp"> 
    <column name="first_seen" length="19" /> 
    </property> 
    <property name="lastSeen" type="timestamp"> 
    <column name="last_seen" length="19" /> 
    </property> 
    <property name="sessionId" type="string"> 
    <column name="session_id" length="26" unique="true" /> 
    </property> 
    <property name="userId" type="java.lang.Long"> 
    <column name="user_id" /> 
    </property> 
    <set name="visits" inverse="true"> 
    <key> 
     <column name="visitor_id" /> 
    </key> 
    <one-to-many class="com.example.project.Visit" /> 
    </set> 
</class> 
</hibernate-mapping> 

和:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Jun 1, 2010 2:49:51 PM by Hibernate Tools 3.2.1.GA --> 
<hibernate-mapping> 
<class name="com.example.project.Visit" table="visit" catalog="orwell"> 
    <id name="id" type="java.lang.Long"> 
    <column name="id" /> 
    <generator class="identity" /> 
    </id> 
    <many-to-one name="visitor" class="com.example.project.Visitor" fetch="join" cascade="all"> 
    <column name="visitor_id" /> 
    </many-to-one> 
    <property name="visitId" type="string"> 
    <column name="visit_id" length="20" unique="true" /> 
    </property> 
    <property name="startTime" type="timestamp"> 
    <column name="start_time" length="19" /> 
    </property> 
    <property name="endTime" type="timestamp"> 
    <column name="end_time" length="19" /> 
    </property> 
    <property name="userAgent" type="string"> 
    <column name="user_agent" length="65535" /> 
    </property> 
    <set name="pageViews" inverse="true"> 
    <key> 
     <column name="visit_id" /> 
    </key> 
    <one-to-many class="com.example.project.PageView" /> 
    </set> 
</class> 
</hibernate-mapping> 
+0

我假设我可以使用“赋值”生成器类,但是如果我有一个包含外键关系(但没有约束)的表的一个表没有主关键约束? – 2010-06-08 15:04:12

+0

您可以显示实际DTO类的映射吗? – Espen 2010-06-08 15:17:18

+0

@Espen - 完成 – 2010-06-08 15:26:08

回答

0

正如你在评论指出,有许多是发电机的id您可以使用。例如,你可以很方便地找到“增量”。完整的概述
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-id

而休眠不会在乎你的数据库限制(主键和外键)。实际上,hibernate在违反某些数据库限制之前无法知道。如果不存在限制,则不能违反:)

+0

太棒了,它已经足够测试它。谢谢 – 2010-06-08 15:58:37

0

您可以在保存对象之前删除<generator class="identity" />元素并手动设置标识。