Domanda

Sto costruendo un data warehouse e si desidera utilizzare InfiniDB come il motore di archiviazione. Tuttavia, non permette chiavi primarie o vincoli di chiave esterna (o eventuali limitazioni per questo).

Sospensione lamenta "Il database restituito il valore di identità non in modo nativo generato" quando esegue un'operazione di inserimento.

Ogni tavolo è relazionale, e contiene una colonna integer unico che è stato in precedenza utilizzato come chiave primaria -. Voglio continuare a questo, ma semplicemente non hanno il vincolo nel db che la colonna è la chiave primaria

sto assumendo il problema è che Hibernate si aspetta che il db per restituire una chiave generata. E 'possibile ignorare questo comportamento in modo da poter impostare il valore del campo chiave primaria me stesso e mantenere Hibernate felice?

- Modifica -

Due delle mappature sono i seguenti:

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

e

<?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>
È stato utile?

Soluzione

Come si è notato in un commento, ci sei molti generatori id è possibile utilizzare. Per esempio, è molti trovano 'incremento' conveniente. Completa
Panoramica http: // docs. jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-id

E Hibernate non si preoccupano i tuoi restrizioni db (entrambi chiavi primarie e chiavi esterne). In realtà, Hibernate ha alcun modo di sapere su certa restrizione db fino a quando è violata. E se la restrizione non esiste, non può mai essere violata:)

Altri suggerimenti

È possibile rimuovere l'elemento <generator class="identity" /> e impostare l'id manualmente prima di salvare l'oggetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top