DBによって生成された主要なキーのない冬眠?
質問
私はデータウェアハウスを構築しており、使用したいと思っています infinidb ストレージエンジンとして。ただし、プライマリキーや外部キーの制約(またはその問題の制約)は許可しません。
Hibernateは、挿入を実行したときに「データベースがネイティブに生成されたアイデンティティ値を返さなかった」と不満を述べています。
各テーブルはリレーショナルであり、以前は一次キーとして使用されていた一意の整数列が含まれています - 私はそれを保持したいのですが、列が主キーであるというDBに制約がありません。
問題は、HibernateがDBが生成されたキーを返すことを期待していることだと思います。この動作をオーバーライドすることは、主要なキーフィールドの価値を自分で設定し、冬眠を幸せに保つことができるようにすることは可能ですか?
- 編集 -
マッピングの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>
解決
コメントで述べたように、使用できる多くのIDジェネレーターがあります。たとえば、多くの人が「増分」が便利だと感じています。完全な概要
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-id
また、HibernateはDBの制限(主要なキーと外国キーの両方)を気にしません。実際、Hibernateには、特定のDB制限が違反されるまで知る方法はありません。そして、制限が存在しない場合、それは決して違反することはできません:)
他のヒント
削除できます <generator class="identity" />
オブジェクトを保存する前に、要素とIDを手動で設定します。