Отображение Hibernate на объект, который уже существует - PullRequest
1 голос
/ 03 мая 2010

У меня есть два класса, ServiceType и ServiceRequest. Каждый ServiceRequest должен указывать, какой это ServiceType. Все ServiceType предопределены в базе данных, а ServiceRequest создается клиентом во время выполнения.

Вот мои файлы .hbm:

<hibernate-mapping>
  <class dynamic-insert="false" dynamic-update="false" mutable="true" name="xxx.model.entity.ServiceRequest" optimistic-lock="version" polymorphism="implicit" select-before-update="false">
    <id column="USER_ID" name="id">
      <generator class="native"/>
    </id>
    <property name="quantity">
        <column name="quantity" not-null="true"/>
    </property>
    <many-to-one cascade="all" class="xxx.model.entity.ServiceType" column="service_type" name="serviceType" not-null="false" unique="false"/>
  </class>
</hibernate-mapping>

и

* +1007 *

Когда я запускаю это, я получаю

com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails

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

Код, выдавший ошибку:

/* Get existing Service Type from database */
ServiceType st = DAOFactory.getDAOFactory().getServiceTypeDAO().getServiceType(newServiceTypeName);

/* Set the ServiceType of the new Service Request*/
newServiceRequest.setServiceType(st);

/* Error occurs inside this function which simply calls
    session.beginTransaction();
    session.save(sr);
    session.getTransaction().commit();  */
DAOFactory.getDAOFactory().getServiceRequestDAO().saveData(newServiceRequest);
return "newRequestDone";

Ответы [ 2 ]

0 голосов
/ 03 мая 2010

Кажется, что ваше исключение SQL на самом деле не соответствует предположению о том, что он пытается создать уже существующий ServiceType. Не ожидаете ли вы увидеть уникальное нарушение ограничения в таблице ServiceType? Первое, что я хотел бы проверить, увидев это, соответствует ли цель FK в базе данных отображению спящего режима? Вы можете получить такие вещи, когда ваш Entity для ServiceType указан (BOB_DEV_SERVICE_TYPES), но фактический внешний ключ, применяемый в ServiceRequest, переходит к (TINA_TEST_SERVICE_TYPES) ​​

0 голосов
/ 03 мая 2010

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

, если это не звучит правдоподобно, покажите свой код Java, и я постараюсь помочь вам дальше:)

* +1007 *

дополнительная помощь: используют ли ваши DAO тот же сеанс гибернации? объекты, загруженные из одного сеанса и сохраненные в другом, могут вызвать проблемы, если вы не используете merge вместо save.

...