Pregunta

Estoy construyendo un almacén de datos y quiero usar Infinidb como el motor de almacenamiento. Sin embargo, no permite las claves primarias o las restricciones de claves exteriores (o cualquier restricción para el caso).

Hibernate se queja "La base de datos no devolvió el valor de identidad generado de forma nativa" cuando realizo un inserto.

Cada tabla es relacional y contiene una columna entera única que se usó anteriormente como la clave principal: quiero mantener eso, pero simplemente no tengo la restricción en el DB de que la columna es la clave principal.

Supongo que el problema es que Hibernate espera que el DB devuelva una clave generada. ¿Es posible anular este comportamiento para que pueda establecer el valor del campo de la clave principal y mantener feliz a Hibernate?

-- editar --

Dos de las asignaciones son las siguientes:

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

y:

<?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>
¿Fue útil?

Solución

Como señaló en un comentario, hay muchos generadores de identificación que puede usar. Por ejemplo, muchos encuentran conveniente 'incremento'. Descripción general completa
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-id

Y a Hibernate no le importarán sus restricciones de DB (tanto las claves primarias como las claves extranjeras). De hecho, Hibernate no tiene forma de saber sobre ciertas restricciones de DB hasta que se viole. Y si la restricción no existe, nunca se puede violar :)

Otros consejos

Puedes eliminar el <generator class="identity" /> elemento y establecer la identificación manualmente antes de guardar el objeto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top