У меня есть 2 таблицы, testInput
и testCases
, а в testInput
у меня есть FK с идентификатором другой таблицы.
Итак, в основном строки, которые я хочу удалить, - это идентификатор ввода, идентификатор testCase, имя и описание.
'43', '21', 'USERNAME', 'USERNAME'
'44', '21', 'PASSWORD', 'PASSWORD'
Я попытался удалить эту строку и получил
java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (
mydb
.testInput
, CONSTRAINTfk02
FOREIGN KEY (testCase
) REFERENCEStestCases
(idtestCase
) ON DELETE NO ACTION ON UPDATE NO ACTION)
Я не хочу удалять запись testCase. Я просто хочу удалить входные данные этого testCase. Что мне делать?
код, если хочешь ...
List<TestInput> previousInputs = TestInput.getInputs(testCaseName);
for(TestInput in : previousInputs) {
Database.deleteObject(in);
}
//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();
}
}
xml TestCases
<hibernate-mapping>
<class name = "TestCase" table = "testCases">
<meta attribute = "class-description">
This class contains the testCases details.
</meta>
<id name = "id" type = "int" column = "idtestCase">
<generator class = "native"/>
</id>
<property name = "name" column = "name" type = "string"/>
<many-to-one name = "type" class = "TestType" column = "type" fetch = "select" lazy = "false"/>
<property name = "data" column = "data" type = "binary"/>
<property name = "amountOfInputs" column = "amountOfInputs" type = "int"/>
<property name = "creationDate" column = "creationDate" type = "string"/>
<property name = "createdBy" column = "createdBy" type = "string"/>
<many-to-one name = "tellerConfig" class = "TellerConfiguration" column = "tellerConfig" fetch = "select" lazy = "false"/>
</class>
</hibernate-mapping>
xml testInput
<hibernate-mapping>
<class name = "TestInput" table = "testInput">
<meta attribute = "class-description">
This class contains the testCases input details.
</meta>
<id name = "id" type = "int" column = "idtestInput">
<generator class = "native"/>
</id>
<property name = "name" column = "name" type = "string"/>
<property name = "description" column = "description" type = "string"/>
<many-to-one name = "testCase" class = "TestCase" column = "testCase" fetch = "select" cascade = "all" lazy = "false" />
</class>
Отредактирую ....
попробуйте удалить cascade=all
из вашего manyToOne и заменить его каждым «полезным» для вас (сохранить, объединить, обновить, ...)
Я почти уверен, что вам нужно решить эту проблему на уровне базы данных, изменив способ определения внешнего ключа fk02
, то есть заменив «ON DELETE NO ACTION» на что-то более подходящее.
Измените ограничение внешнего ключа fk02 с «NO ACTION» на «SET NULL».
FOREIGN KEY (idtestcase)
REFERENCES testCases(idtestCase)
ON DELETE SET NULL
Ваши сопоставленные классы также могут быть полезны