JPA中的修剪字符串字段

我有一个数据类型为char(20)的db表。我不允许将其更改为varchar。

我正在写一个映射到该表的JPA实体。我希望在我的实体类中表示此列的字符串字段始终包含调整后的值,而不是用数据库中存在的空格填充的20个字符的值。

我看不到任何简单的方法来做到这一点。(注释会震撼!)。此刻,我只是从我的getter()返回一个修整后的值,但这感觉像是一团糟。

谷歌搜索对此没有帮助。有任何想法吗?

回答:

或者,您可以使用生命周期注释:

@Entity

public class MyEntity {

@PostLoad

protected void repair(){

if(myStringProperty!=null)myStringProperty=myStringProperty.trim();

}

private String myStringProperty;

public String getMyStringProperty() {

return myStringProperty;

}

public void setMyStringProperty(String myStringProperty) {

this.myStringProperty = myStringProperty;

}

}

如果在多个实体上发生这种情况,则可以创建一个自定义批注并编写一个专用的EntityListener。

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.FIELD)

public @interface Trim {}

public class TrimListener {

private final Map<Class<?>, Set<Field>> trimProperties =

new HashMap<Class<?>, Set<Field>>();

@PostLoad

public void repairAfterLoad(final Object entity) throws Exception {

for (final Field fieldToTrim : getTrimProperties(entity.getClass())) {

final String propertyValue = (String) fieldToTrim.get(entity);

if (propertyValue != null)

fieldToTrim.set(entity, propertyValue.trim());

}

}

private Set<Field> getTrimProperties(Class<?> entityClass) throws Exception {

if (Object.class.equals(entityClass))

return Collections.emptySet();

Set<Field> propertiesToTrim = trimProperties.get(entityClass);

if (propertiesToTrim == null) {

propertiesToTrim = new HashSet<Field>();

for (final Field field : entityClass.getDeclaredFields()) {

if (field.getType().equals(String.class)

&& field.getAnnotation(Trim.class) != null) {

field.setAccessible(true);

propertiesToTrim.add(field);

}

}

trimProperties.put(entityClass, propertiesToTrim);

}

return propertiesToTrim;

}

}

现在使用注释所有相关的String字段,@Trim并在persistence.xml中将侦听器注册为默认实体侦听器:

<persistence-unit ..>

<!-- ... -->

<default-entity-listeners>

com.somepackage.TrimListener

and.maybe.SomeOtherListener

</default-entity-listeners>

</persistence-unit>

以上是 JPA中的修剪字符串字段 的全部内容, 来源链接: utcz.com/qa/417019.html

回到顶部