我遇到以下情况:我的应用程序需要保存由数据库中大写的用户键入的所有字符串,无论用户如何键入它,应用程序都需要在保存之前将所有内容都大写。
我知道我可以在保存之前调用每个字符串上的toUpperCase()方法,或者在每个setter方法上调用它,但我真的不想这样做,我正在寻找一种更自动的方式来无需在应用程序上更改太多代码就可以实现。
我正在使用JSF,JPA2,Eclipselink和EJB3。
有没有人有任何建议?
答案 0 :(得分:3)
您可以为此使用生命周期事件侦听器。有几种方法可以实现它:
1:默认听众:
public class StringCapListener {
@PrePersist
@PreUpdate
public void capitalize(Object o) {
// capitalize string attributes
}
...
对于大写,您将需要使用反射(提取所有字符串字段并更改其值)或让您的实体实现接口。
如果仅在多个实体上使用侦听器,则更喜欢在实体类上使用@EntityListeners
注释。要在所有实体上使用侦听器,请使用默认侦听器。不幸的是,您只能用XML定义它们:
<entity-mappings ...>
<persistence-unit-metadata>
<persistence-unit-defaults>
<entity-listeners>
<entity-listener class="com.example.StringCapListener">
2:继承的侦听器方法
让您的实体派生出BaseEntity
种类。这个基类可以实现一个在persist&amp; amp;触发器上触发的监听器方法。更新。
@PrePersist
@PreUpdate
public void capitalize(BaseEntity o) {
// capitalize string attributes
}
您需要使用相同的反射魔法来获取和更改所有字符串属性。
答案 1 :(得分:-1)
我正在考虑一个界面
public interface Processor<TResult, TInput> {
public TResult process(TInput input);
}
public class StringProcessor implements Processor<String, String> {
public String process(String input) {
return input.toUpperCase();
}
}
然后在持久化之前调用每个字符串上的接口
//...
public void persistString(String input) {
input = processor.process(input);
// Persistence logic
}