我使用H2数据库进行单元测试。
在我的应用程序中,我有一个名为FooXml
的实体对象,其定义如下:
@Entity
@Table(name = "T_FOOXML")
@SequenceGenerator(allocationSize = 1, name = "S_FOOXML", sequenceName = "S_FOOXML")
@NamedQueries( ... )
@Cache(usage = CacheConcurrencyStrategy.NONE)
public class FooXml implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "S_FOOXML")
@Column(name = "FOOXML_ID")
private Integer id;
@Type(type = "my.app.common.HibernateXMLType")
@Column(name = "FOOXML_CONTENT")
@Basic(fetch = FetchType.LAZY)
private String xmlContent;
...
}
因此,为了从数据库读取/写入XML内容,我创建了自己的XMLType my.app.common.HibernateXMLType
,它实现了org.hibernate.usertype.UserType
。
方法nullSafeSet
和nullSafeGet
在那里定义。
现在,我想在我的测试中使用H2内存数据库,有些测试正在使用这个FooXml
类。
由于H2不支持Oracle XmlType
,我必须自定义my.app.common.HibernateXMLType
。
例如,我添加了那部分:
public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
...
// Case where H2 Database is used as the dataSource...
if (st.getConnection() instanceof org.h2.jdbc.JdbcConnection) {
// Set the XML as a String...
st.setObject(index, (String) value);
} else {
// Case of "normal" behavior (outside tests context)
...
}
}
我对这种方法有几点疑虑:
org.h2.jdbc.JdbcConnection
,我必须在WAR包中添加h2-database依赖项。问题:
my.app.common.HibernateXMLTypeForH2
而不是my.app.common.HibernateXMLType
)进行测试?ps:在H2数据库中创建表的脚本如下:
create table T_FOO_XML (
FOOXML_ID NUMBER(9, 0) not null,
FOOXML_CONTENT CLOB(400000)
);
技术细节:H2数据库v1.3.153,JUnit 4.8.1,Java 1.6,Hibernate 3.2.2,Oracle 10g用于无测试环境。< / p>
答案 0 :(得分:2)
我添加了直接链接的代码 在生产中测试目的 代码...
在某种程度上,是的,因为您使用H2进行测试。但是,您可能会认为您使应用程序更加独立于数据库,并且仅使用H2进行测试只是巧合。稍后,您可以使用H2作为产品试用版附带的数据库。或者您可以在以后支持除Oracle和H2之外的其他数据库。
h2-database dependency
为避免对H2的编译时依赖性,您可以使用:
String url = st.getConnection().getMetaData().getURL();
boolean isH2 = url.startsWith("jdbc:h2:");
if (isH2) {
...
}
还有其他方法,例如getMetaData().getDatabaseProductName().equals("H2")
- 基本上与String而不是Class对象进行比较。当然,这不是编译时安全的,另一方面,H2可能会在将来返回不同的连接类,因此JdbcConnection
也不稳定。
答案 1 :(得分:0)
public class Oracle10gDialectWithXMLType extends Oracle10gDialect {
public Oracle10gDialectWithXMLType() {
registerHibernateType(XMLType._SQL_TYPECODE, "XMLTYPE");
registerColumnType(XMLType._SQL_TYPECODE, "XMLTYPE");
}
}
并将其添加为属性中的ur dialect。