Я пытаюсь удалить данные из базы данных, используя общий подход. он работает для добавления, обновления, но при удалении я получаю это:
java.sql.SQLIntegrityConstraintViolationException: не удается удалить или обновить родительскую строку: ограничение внешнего ключа завершается с ошибкой (
mydb
.testCases
, CONSTRAINTfk03
FOREIGN KEY (type
) ССЫЛКИtestType
(idtestType
) ON УДАЛИТЬ НЕТ ДЕЙСТВИЙ НА ОБНОВЛЕНИИ НЕТ ДЕЙСТВИЙ)
База данных
//delete the object to the database
public static void deleteObject(Object object) {
SessionFactory factory = HibernateUtil.GetSessionFactory();
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
session.delete(object);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
Моя попытка удаления
List<TestFlow> flow = getFlow(flowName);
//delete the current one
for(TestFlow tf : flow) {
Database.deleteObject(tf);
}
HBM
<hibernate-mapping>
<class name="com.atp.Model.TestCases.TestFlow" table="testFlow">
<meta attribute="class-description">
This class contains the testCases flow details.
</meta>
<id name="id" type="int" column="idtestFlow">
<generator class="native"/>
</id>
<property name="name" column="name" type="string"/>
<many-to-one name="testCase" class="com.atp.Model.TestCases.TestCase" column="testCase" fetch="select" cascade="all" lazy="false"/>
<property name="rowNumber" column="rowNumber" type="int"/>
<property name="testCaseStatus" column="testCaseStatus" type="int"/>
<property name="params" column="params" type="string" />
<property name="creationDate" column="creationDate" type="string"/>
<property name="createdBy" column="createdBy" type="string"/>
<property name="targetType" column="targetType" type="string"/>
<property name="targetName" column="targetName" type="string"/>
<property name="output" column="output" type="string"/>
<property name="completionDate" column="completionDate" type="string"/>
<property name="isCompleted" column="isCompleted" type="int"/>
</class>
Кажется, что ваш внешний ключ в таблице "Назначения" имеет значение "Вкл.": "Ограничить". Измените Constraint assignments_user_id_foreign на On delete: Cascade, и вы должны иметь возможность удалять пользователей, сохраняя внешний ключ.
Вы можете сделать это двумя способами:
а. Сначала удалите связанные записи из таблицы встреч с помощью отдельной инструкции удаления.
б. Добавьте опцию delete cascade к внешнему ключу assignments_user_id_foreign. Эта опция автоматически удалит любые связанные записи из таблицы встреч для пользователя, который будет удален при удалении записи пользователя.
Попробуйте это как свою потребность
Query q = session.createQuery("from Stock where stockCode = :stockCode ");
q.setParameter("stockCode", "4715");
Stock stock = (Stock)q.list().get(0);
session.delete(stock);
или же
@OneToMany(cascade=CascadeType.REMOVE)
List<TestFlow> flow = getFlow(flowName);
//delete the current one
for(TestFlow tf : flow) {
Database.deleteObject(tf);
}
Вы не можете удалить родительскую запись и разрешить детям записи как сироты по умолчанию.
Добавьте каскад удаления в ограничение внешнего ключа, чтобы предотвратить появление сирот.
ALTER TABLE mydb.testCases DROP FOREIGN KEY fk03;
ALTER TABLE mydb.testCases ADD CONSTRAINT fk03 FOREIGN KEY (type) REFERENCES
testType(idtestType) ON DELETE CASCADE ON UPDATE NO ACTION;
См. Пример Hibernate - Cascade (сохранение, обновление, удаление и удаление-сирота) для получения дополнительной информации.