没有db生成的主键的Hibernate?

时间:2010-06-08 15:01:15

标签: java hibernate orm infinidb

我正在构建数据仓库,并希望使用InfiniDB作为存储引擎。但是,它不允许主键或外键约束(或任何约束)。

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

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

我假设问题是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>

2 个答案:

答案 0 :(得分:0)

正如您在评论中指出的那样,您可以使用许多id生成器。例如,你们很多人发现“增量”很方便。完整概述
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-id

hibernate不会关心你的db限制(主键和外键)。实际上,在违反之前,hibernate无法知道某些数据库限制。如果不存在限制,则永远不会违反:)

答案 1 :(得分:0)

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