Jpa 无法获取DBUnit以导入CollectionTable的数据

Jpa 无法获取DBUnit以导入CollectionTable的数据,jpa,junit,eclipselink,jpa-2.0,dbunit,Jpa,Junit,Eclipselink,Jpa 2.0,Dbunit,我拥有以下实体: @Entity @Table @NamedQuery(name = Constants.FINDALLFINDERNAME, query = Constants.FINDALLQUERY) public class Customer extends AuditableEntity { ... @ElementCollection(fetch = FetchType.EAGER)

我拥有以下实体:

    @Entity
    @Table
    @NamedQuery(name = Constants.FINDALLFINDERNAME,
                query = Constants.FINDALLQUERY)
    public class Customer extends AuditableEntity {

        ...

        @ElementCollection(fetch = FetchType.EAGER)
        @CollectionTable(name = Constants.PHONES, joinColumns = @JoinColumn(name = Constants.CUSTOMER_ID))
        @Column(name = Constants.CUSTOMER_PHONES, nullable = true)
        private List<Phone> phones;
下面是我的单元测试:

    ...

    public class CustomerTest {

        //-----------------------------------------------------------------------//
        // Attributes
        //-----------------------------------------------------------------------//
        private static EntityManagerFactory emf;
        private static EntityManager em;
        private static EntityTransaction tx;

        //-----------------------------------------------------------------------//
        // Lifecycle Methods
        //-----------------------------------------------------------------------//
        @BeforeClass
        public static void initEntityManager() throws Exception {
            emf = Persistence.createEntityManagerFactory(Constants.PERSISTENCEUNIT);
            em = emf.createEntityManager();
        }

        @AfterClass
        public static void closeEntityManager() throws SQLException {
            if (em != null) em.close();
            if (emf != null) emf.close();
        }

        @Before
        public void initTransaction() throws Exception {
            tx = em.getTransaction();
            seedData();
        }

        @After
        public void afterTests() throws Exception {
            dumpData();
        }

        //-----------------------------------------------------------------------//
        // Unit Tests
        //-----------------------------------------------------------------------//

        @Test
        public void test__Create__and__Read_SingleCustomer() throws Exception {
            // Creates an instance of Customer
            Customer customer = CustomerFixture.createSingleCustomer();

            // Persists the Customer to the database
            tx.begin();
            em.persist(customer);
            tx.commit();

            tx.begin();
            assertNotNull("ID should not be null", customer.getId());
            // Retrieves a single Customer from the database
            TypedQuery<Customer> q = em.createNamedQuery(
                    Constants.FINDALLFINDERNAME, Customer.class);
            List<Customer> customers = q.getResultList();
            assertThat(customers.size(), is(4));
            tx.commit();
        }

        @Test
        public void test__DeleteCustomer() throws Exception {
            tx.begin();

            // Uses Sting Based Criteria
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<Customer> c = cb.createQuery(Customer.class);
            Root<Customer> cust = c.from(Customer.class);
            c.select(cust)
                    .where(cb.equal(cust.get("username"), "user1"));
            Customer result = em.createQuery(c).getSingleResult();

            em.remove(result);

            // Retrieves all the Customers from the database
            TypedQuery<Customer> q = em.createNamedQuery(
                    Constants.FINDALLFINDERNAME, Customer.class);
            List<Customer> customers = q.getResultList();

            tx.commit();

            assertThat(customers.size(), is(3));
        }                    

        //-----------------------------------------------------------------------//
        // DBUnit Helper Methods
        //-----------------------------------------------------------------------//

        protected void seedData() throws Exception {
            tx.begin();
            Connection connection = em.unwrap(java.sql.Connection.class);

            try {
                IDatabaseConnection dbUnitCon = new DatabaseConnection(connection);

                dbUnitCon.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
                        new H2DataTypeFactory());

                IDataSet dataSet = getDataSet();

                DatabaseOperation.REFRESH.execute(dbUnitCon, dataSet);
            } finally {
                tx.commit();
                connection.close();
            }
        }

        protected IDataSet getDataSet() throws Exception {
            return new FlatXmlDataSetBuilder().build(new FileInputStream("./src/test/resources/dataset.xml"));
        }

        protected void dumpData() throws Exception {
            tx.begin();
            Connection connection = em.unwrap(java.sql.Connection.class);

            try {
                IDatabaseConnection dbUnitCon = new DatabaseConnection(connection);
                dbUnitCon.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
                        new H2DataTypeFactory());

                IDataSet dataSet = dbUnitCon.createDataSet();

                FlatXmlDataSet.write(dataSet, new FileOutputStream("./target/test-dataset_dump.xml"));
                System.out.println("Dataset written");
            } finally {
                tx.commit();
                connection.close();
            }
        }
    }
。。。
公共类客户测试{
//-----------------------------------------------------------------------//
//属性
//-----------------------------------------------------------------------//
私有静态实体管理器工厂emf;
私有静态实体管理器em;
私有静态实体事务tx;
//-----------------------------------------------------------------------//
//生命周期方法
//-----------------------------------------------------------------------//
@课前
公共静态void initEntityManager()引发异常{
emf=Persistence.createEntityManagerFactory(Constants.PERSISTENCEUNIT);
em=emf.createEntityManager();
}
@下课
public static void closeEntityManager()引发SQLException{
如果(em!=null)em.close();
如果(emf!=null)emf.close();
}
@以前
public void initTransaction()引发异常{
tx=em.getTransaction();
种子数据();
}
@之后
public void postests()引发异常{
dumpData();
}
//-----------------------------------------------------------------------//
//单元测试
//-----------------------------------------------------------------------//
@试验
public void test\uuuu Create\uuuu和\uuuu Read\u SingleCustomer()引发异常{
//创建Customer的实例
Customer=CustomerFixture.createSingleCustomer();
//将客户持久化到数据库
tx.begin();
em.persist(客户);
tx.commit();
tx.begin();
assertNotNull(“ID不应为null”,customer.getId());
//从数据库检索单个客户
TypedQuery q=em.createNamedQuery(
Constants.FINDALLFINDERNAME,Customer.class);
列出客户=q.getResultList();
资产(customers.size(),为(4));
tx.commit();
}
@试验
public void test\uu DeleteCustomer()引发异常{
tx.begin();
//使用基于Sting的标准
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery c=cb.createQuery(Customer.class);
Root cust=c.from(Customer.class);
c、 选择(客户)
其中(cb.equal(客户获取(“用户名”),“用户1”);
Customer result=em.createQuery(c).getSingleResult();
em.remove(结果);
//从数据库检索所有客户
TypedQuery q=em.createNamedQuery(
Constants.FINDALLFINDERNAME,Customer.class);
列出客户=q.getResultList();
tx.commit();
资产(customers.size(),为(3));
}                    
//-----------------------------------------------------------------------//
//DBUnit辅助方法
//-----------------------------------------------------------------------//
受保护的void seedData()引发异常{
tx.begin();
Connection=em.unwrap(java.sql.Connection.class);
试一试{
IDatabaseConnection dbUnitCon=新数据库连接(连接);
dbUnitCon.getConfig().setProperty(DatabaseConfig.PROPERTY\u DATATYPE\u工厂,
新的H2DataTypeFactory());
IDataSet dataSet=getDataSet();
DatabaseOperation.REFRESH.execute(dbUnitCon,dataSet);
}最后{
tx.commit();
connection.close();
}
}
受保护的IDataSet getDataSet()引发异常{
返回新的FlatXmlDataSetBuilder().build(新文件输入流(“./src/test/resources/dataset.xml”);
}
受保护的void dumpData()引发异常{
tx.begin();
Connection=em.unwrap(java.sql.Connection.class);
试一试{
IDatabaseConnection dbUnitCon=新数据库连接(连接);
dbUnitCon.getConfig().setProperty(DatabaseConfig.PROPERTY\u DATATYPE\u工厂,
新的H2DataTypeFactory());
IDataSet dataSet=dbUnitCon.createDataSet();
write(数据集,新文件输出流(“./target/test-dataSet_dump.xml”);
System.out.println(“数据集写入”);
}最后{
tx.commit();
connection.close();
}
}
}
有人能帮助我了解如何使用DBUnit导入CollectionTables吗?

我可以浏览并尝试该解决方案,但对其进行了一些修改:

财产:

        // Set the property by passing the new IColumnFilter
        dbUnitCon.getConfig().setProperty(
                DatabaseConfig.PROPERTY_PRIMARY_KEY_FILTER,
                new NullPrimaryKeyFilter("ID", "ADDRESS_KEY", "P_NUMBER", "HOBBY_NAME"));
然后,过滤器类:

    class NullPrimaryKeyFilter implements IColumnFilter {
        private String[] keys = null;

        NullPrimaryKeyFilter(String... keys) {
            this.keys = keys;
        }

        public boolean accept(String tableName, Column column) {
            for(String key: keys){
                if(column.getColumnName().equalsIgnoreCase(key)){
                    return true;
                }
            }
            return false;
        }
    }
现在,我可以对测试中的所有表使用过滤器

        // Set the property by passing the new IColumnFilter
        dbUnitCon.getConfig().setProperty(
                DatabaseConfig.PROPERTY_PRIMARY_KEY_FILTER,
                new NullPrimaryKeyFilter("ID", "ADDRESS_KEY", "P_NUMBER", "HOBBY_NAME"));
    class NullPrimaryKeyFilter implements IColumnFilter {
        private String[] keys = null;

        NullPrimaryKeyFilter(String... keys) {
            this.keys = keys;
        }

        public boolean accept(String tableName, Column column) {
            for(String key: keys){
                if(column.getColumnName().equalsIgnoreCase(key)){
                    return true;
                }
            }
            return false;
        }
    }