2014-09-30 4 views
5

मैं भविष्य में संदर्भ के लिए इस प्रश्न का उत्तर और उत्तर दे रहा हूं, क्योंकि मुझे लगता है कि मुझे डीबीयूनीट के साथ एक आम समस्या का एक सभ्य समाधान मिला है। मुझे उम्मीद है कि यह लाइन के नीचे कहीं, किसी की मदद करता है।डीबीयूनीट क्लीन-डालने में विफल रहता है: विदेशी कुंजी बाधा

मैं DbUnit 2.5.0 और TestNG 6.8.8 का उपयोग कर रहा हूं। मेरा उपयोग केस डेटाबेस के एक हिस्से के लिए है जिसमें 3 इकाइयां शामिल हैं। ServiceUser है जिसमें Administrable और UserGroup दोनों के लिए एक विदेशी कुंजी है।

मैं http://city81.blogspot.com/2011/03/testing-jpa-entities-using-dbunit.html

public abstract class AbstractDatabaseTest { 
    protected EntityManager em; // initialized elsewhere 
    private IDatabaseConnection connection; 
    private IDataSet dataset; 

    @BeforeClass 
    private void setupDatabaseResource() throws Exception { 
     // using Hibernate 
     connection = new DatabaseConnection(((SessionImpl) (em.getDelegate())).connection()); 
     connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory()); 

     // full database export 
     IDataSet fullDataSet = connection.createDataSet(); 

     final String datasetPath = String.format("%s%s", RESOURCE_FOLDER, "Testing.xml"); 
     FlatXmlDataSet.write(fullDataSet, new FileOutputStream(datasetPath)); 

     FlatXmlDataSetBuilder flatXmlDataSetBuilder = new FlatXmlDataSetBuilder(); 
     flatXmlDataSetBuilder.setColumnSensing(true); 
     dataset = flatXmlDataSetBuilder.build(new FileInputStream(datasetPath)); 
    } 

    @AfterMethod 
    public void cleanDB() throws Exception { 
     em.getTransaction().begin(); 
     DatabaseOperation.CLEAN_INSERT.execute(connection, dataset); 
     em.getTransaction().commit(); 
    } 
} 

से कोड उदाहरण के सबसे ज्यादा अनुयायी इसी का परिणाम XMLDataSet (छोड़े गए डेटा) पीछा कर रहा है:

<dataset> 
    <administrable/> 
    <serviceuser/> 
    <usergroup/> 
</dataset> 

जब TestNG@AfterMethod कार्यान्वित करता है, मैं निम्नलिखित मिल अपवाद:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException 
Cannot delete or update a parent row: a foreign key constraint fails (`testing_db`.`serviceuser`, CONSTRAINT `FK_gyylcfbhpl2ukqs5rm7sq0uy8` FOREIGN KEY (`userGroup_id`) REFERENCES `usergroup` (`id`)) 

उत्तर

11

समस्या यह है कि XMLDataSet मैंने ऊपर बनाया है तालिकाओं में विदेशी कुंजी बाधाओं को नहीं जानता है, और तालिका सूची को वर्णानुक्रम से बनाता है। CLEAN_INSERT ऑपरेशन, तालिकाओं की सूची लेता है और इसे विपरीत क्रम में घुमाता है, और इसके लिए संदर्भित इकाई (यहां: ServiceUser.userGroup_id) संदर्भित इकाई (यहां: UserGroup) से पहले हटा दिया जाना चाहिए।

:

मैं Unitils doesn't work और http://forum.spring.io/forum/spring-projects/data/12868-dbunit-test-fails-mysql-server-hates-me?p=337672#post337672

DbUnit प्रलेखन में कुछ मामूली खुदाई डाटासेट है, जो विदेशी कुंजी निर्भरता के लिए जाँच करता है और उचित रूप से संस्थाओं का आदेश देने की कोशिश करता है बनाने के लिए एक को सही दृष्टिकोण करने के लिए नेतृत्व के माध्यम से इस जानकारी मिली

IDataSet fullDataSet = new FilteredDataSet(new DatabaseSequenceFilter(connection), connection.createDataSet()); 

परिणाम:

<dataset> 
    <administrable/> 
    <usergroup/> 
    <serviceuser/> 
</dataset> 

हो जाएगा ताकि CLEAN_INSERT सही ढंग से।

अस्वीकरण: मैं परिपत्र निर्भरताओं या आत्म-संदर्भित विदेशी कुंजी में नहीं आया हूं, और मैंने परीक्षण नहीं किया है कि यह फिक्स उन्हें संभाल सकता है।

+0

आपने कोड स्निपेट कहां रखा? –

+0

मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं। मैं कोड स्निपेट के बारे में कुछ भी नहीं कहता, और सभी प्रासंगिक कोड प्रश्न या उत्तर में उपलब्ध हैं। – blagae

+0

कोड आईडीटासेट स्निपेट जिसका आप उपयोग कर रहे थे। आपने उस फाइल में किस फाइल को रखा था? –

संबंधित मुद्दे