Frage

Ich baue ein Data Warehouse und möchte verwenden Infinidb als Speichermotor. Es erlaubt jedoch keine Primärschlüssel oder ausländischen Schlüsselbeschränkungen (oder Einschränkungen für diese Angelegenheit).

Hibernate beschwert sich "Die Datenbank hat keinen nativ generierten Identitätswert zurückgegeben", wenn ich einen Einsatz ausführe.

Jede Tabelle ist relational und enthält eine eindeutige Ganzzahlspalte, die zuvor als Hauptschlüssel verwendet wurde.

Ich gehe davon aus, dass Hibernate erwartet, dass die DB einen generierten Schlüssel zurückgibt. Ist es möglich, dieses Verhalten zu überschreiben, damit ich den Wert des Primärschlüsselfeldes selbst festlegen und Hibernate glücklich halten kann?

-- bearbeiten --

Zwei der Zuordnungen sind wie folgt:

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

und:

<?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>
War es hilfreich?

Lösung

Wie Sie in einem Kommentar festgestellt haben, können Sie viele ID -Generatoren verwenden. ZB, Sie finden viele "Inkrement" bequem. Komplette Übersicht
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mappingdeclaration-id

Und Hibernate kümmert sich nicht um Ihre DB -Beschränkungen (sowohl Primärschlüssel als auch Fremdschlüssel). In der Tat hat Hibernate keine Möglichkeit, über bestimmte DB -Beschränkungen zu wissen, bis sie verletzt wird. Und wenn keine Einschränkung vorliegt, kann sie niemals verletzt werden :)

Andere Tipps

Sie können die entfernen <generator class="identity" /> Elemente und setzen Sie die ID manuell, bevor Sie das Objekt speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top