1

データ ウェアハウスを構築しており、 InfiniDBをストレージ エンジンとして使用したいと考えています。ただし、主キーまたは外部キーの制約 (またはその制約) は許可されません。

挿入を実行すると、Hibernate は「データベースがネイティブに生成された ID 値を返しませんでした」と文句を言います。

各テーブルはリレーショナルであり、以前に主キーとして使用されていた一意の整数列が含まれています-それを保持したいのですが、列が主キーであるという制約がデータベースにありません。

問題は、Hibernate がデータベースが生成されたキーを返すことを期待していることだと思います。この動作をオーバーライドして、主キー フィールドの値を自分で設定し、Hibernate を満足させることはできますか?

- 編集 -

2 つのマッピングは次のとおりです。

<?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>
4

2 に答える 2

0

コメントで述べたように、使用できるIDジェネレーターはたくさんあります。たとえば、多くの人が「インクリメント」が便利だと感じています。完全な概要
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-id

また、休止状態はデータベースの制限(主キーと外部キーの両方)を気にしません。実際、休止状態は、違反するまで特定のdb制限について知る方法がありません。そして、制限が存在しない場合、それは決して違反されることはありません:)

于 2010-06-08T15:28:14.287 に答える
0

オブジェクトを保存する前に、要素を削除し<generator class="identity" />てIDを手動で設定できます。

于 2010-06-08T15:47:27.507 に答える