Спезок без первичных ключей, сгенерированных DB?

StackOverflow https://stackoverflow.com/questions/2998548

  •  24-10-2019
  •  | 
  •  

Вопрос

Я строю хранилище данных и хочу использовать Infinidb как двигатель хранения. Тем не менее, это не допускает первичных ключей или ограничений иностранных ключей (или любых ограничений в этом отношении).

Hibernate жалуется, что «база данных не возвращала идентифицированное значение идентификации», когда я выполняю вставку.

Каждая таблица является реляционной и содержит уникальный целочисленный столбец, который ранее использовался в качестве основного ключа - я хочу сохранить это, но просто не имеет ограничения в БД, что столбец является основным ключом.

Я предполагаю, что проблема в том, что Hibernate ожидает, что БД вернет сгенерированный ключ. Можно ли переопределить это поведение, чтобы я мог установить ценность первичного поля ключа самостоятельно и оставлять смягченным?

-- редактировать --

Два отображения следующие:

<?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>
Это было полезно?

Решение

Как вы отметили в комментарии, вы можете использовать много генераторов идентификаторов. Например, вы найдете «приращение» удобным. Полный обзор
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-id

И Hibernate не заботится о ваших ограничениях БД (как основные ключи, так и иностранные ключи). На самом деле, Hibernate не может узнать об определенном ограничении БД, пока оно не будет нарушено. И если ограничения не существует, его никогда не может быть нарушено :)

Другие советы

Вы можете удалить <generator class="identity" /> элемент и установите ID вручную перед сохранением объекта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top