Hibernate如何忽略单元测试中的某些字段 [英] How to Ignore Certain Fields in unit tests, Hibernate
本文介绍了Hibernate如何忽略单元测试中的某些字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的实体模型中有以下字段.
I have the following field in my entity model.
@Column(name="key")
@ColumnTransformer(
read="AES_DECRYPT(key, SHA1('passcode'))",
write="AES_ENCRYPT(?, SHA1('passcode'))")
private String secret_key;
我正在使用MySql数据库,并且hibernate将使用AES_ENCRYPT和AES_DECRYPT函数完美地加密/解密密钥值.但是,Spring嵌入式数据库(HSQL或H2)不了解此特定的MySql函数.它将引发以下错误:
I am using MySql database and hibernate will perfectly encrypt/decrypt the key value with AES_ENCRYPT and AES_DECRYPT function. However, the spring embedded databases (HSQL or H2) doesn't know about this specific MySql functions. It throws the following error:
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not insert: [com.xxx.Table]
at ...
Caused by: org.hibernate.exception.SQLGrammarException: could not insert: [com.xxx.Table]
at ...
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: AES_ENCRYPT
所以我的问题是,
- 我如何告诉Hibernate在某些数据库中编写时忽略此字段.或
- 如何使用此mysql函数使HSQL和/或H2正常工作.
谢谢
推荐答案
将此类添加到您的测试配置中:
add this class to your test config:
@Component
public class RemoveAesFunction {
@PostConstruct
public void postConstruct() {
setKey(MyEntity.class);
}
private void setKey(Class<?> clazz) {
try {
Field field = clazz.getDeclaredField("firstName");
ColumnTransformer columnTransformer = field.getDeclaredAnnotation(ColumnTransformer.class);
updateAnnotationValue(columnTransformer, "read","");
updateAnnotationValue(columnTransformer, "write","?");
} catch (NoSuchFieldException | SecurityException e) {
throw new RuntimeException();
}
}
@SuppressWarnings("unchecked")
private void updateAnnotationValue(Annotation annotation, String annotationProperty,String value) {
Object handler = Proxy.getInvocationHandler(annotation);
Field merberValuesField;
try {
merberValuesField = handler.getClass().getDeclaredField("memberValues");
} catch (NoSuchFieldException | SecurityException e) {
throw new IllegalStateException(e);
}
merberValuesField.setAccessible(true);
Map<String, Object> memberValues;
try {
memberValues = (Map<String, Object>) merberValuesField.get(handler);
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new IllegalStateException(e);
}
memberValues.put(annotationProperty, value);
}
}
这篇关于Hibernate如何忽略单元测试中的某些字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文