У меня есть два класса, 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";