Остановить Hibernate от обновления существующих записей - PullRequest
4 голосов
/ 23 марта 2012

Я пытаюсь перейти в спящий режим, чтобы писать новые объекты каждый раз, когда выполняю сохранение, а не обновляю существующие записи.

public class Risk {
    private long riskID;
    private Vehicle vehicle;
}

public class Vehicle {  
    private long vehicleID;
    private long riskID;
    private String regNumber;
    private String abiCode;
    private String make;
    private String model;
}

Так что, если написать риск в БД. Затем я меняю транспортное средство в Интернете и пытаюсь сохранить риск для БД во второй раз. Я хотел бы иметь два риска в таблице рисков и два транспортных средства в таблице транспортных средств.

В настоящее время я использую сеанс гибернации Save (Object o). Это всегда создает новый риск в БД, но никогда не создает новый автомобиль. Это просто обновление оригинала.

Вот мой файл сопоставления:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class lazy="false" name="uk.co.test.Risk" schema="quote_engine" table="GV_RISK" >
    <id column="riskID" name="riskID" type="long">
        <generator class="identity"/>
    </id>

    <many-to-one name="vehicle" class="uk.co.test.Vehicle" column="vehicleID" not-null="true" cascade="all" unique="true" />

</class>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="uk.co.test.Vehicle" schema="quote_engine" table="GV_VEHICLE">

    <id name="vehicleID" type="long" column="vehicleID">
        <generator class="identity" />
    </id>

    <property name="regNumber" type="string" column="regNumber" />
    <property name="abiCode" type="string" column="abiCode" />
    <property name="make" type="string" column="make" />
    <property name="model" type="string" column="model" />


</class>

Ответы [ 12 ]

1 голос
/ 30 марта 2012
This Statment Will Help You

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
session.saveOrUpdate(object);
transaction.commit();
0 голосов
/ 11 апреля 2012

Было бы полезно узнать контекст вашего проекта и то, чего вы в конечном итоге пытаетесь достичь.

Решение вашей проблемы может лежать не на том уровне, о котором вы просили.

Я подозреваю, что вы хотите как-то отслеживать изменения, то есть вести историю или контрольный журнал . Вы можете сделать это с помощью Envers для спящего режима. Он предоставляет аннотацию @Audited и позволяет запрашивать исторические данные.

В противном случае вы можете пересмотреть свои классы для неизменяемости . Ни одна сущность не должна быть изменчивой. Любое изменение в сущности порождает новую сущность (то, что иногда называется постоянная структура данных в функциональном мире). Новый объект может быть присоединен к сеансу автоматически, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...