2014-09-25 6 views
1

У меня есть следующая ситуация: моему приложению необходимо сохранить все строки, введенные пользователем, заглавными на основе базы данных, независимо от того, как пользователь набирает ее. Приложению необходимо загладить все до сохранения.Автоматическое автоматическое перетаскивание строк до сохранения

Я знаю, что я мог бы просто вызвать метод toUpperCase() на каждой строке перед сохранением или вызвать его для каждого метода setter, но я действительно не хочу этого делать, я ищу более автоматический путь для этого, не меняя слишком много кода на приложение.

Я использую JSF, JPA2, Eclipselink и EJB3.

Есть ли у кого-нибудь предложения?

+0

Лично я не думаю, что добавление одной строки кода будет «сменять слишком много кода» –

+0

Это одна строка для каждой строки, которую я сохраняю –

+1

Если вы будете использовать [Спящий режим] (http://hibernate.org)), тогда вы можете написать [Перехватчик] (http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/Interceptor.html), который мог бы перехватить сохраняющееся и сделать вашу логику до транзакция завершается. В eclipselink я не знаю о таком решении, поэтому, вероятно, вам придется менять свои строки повсюду. –

ответ

3

Вы можете использовать обработчики событий жизненного цикла для этого. Есть несколько способов реализации его:

1: по умолчанию слушателей:

public class StringCapListener { 
    @PrePersist 
    @PreUpdate 
    public void capitalize(Object o) { 
     // capitalize string attributes 
    } 
    ... 

Для спекулируя вам нужно будет либо использовать отражение (извлекая все строковые поля и изменяя их значение) или пусть ваши лица реализовать интерфейс.

Если вы используете прослушиватель только для нескольких объектов, предпочтите использовать аннотацию для классов сущностей. Чтобы использовать слушатели для всех объектов, используйте прослушиватели по умолчанию. К сожалению, можно только определить их в XML:

<entity-mappings ...> 
    <persistence-unit-metadata> 
     <persistence-unit-defaults> 
      <entity-listeners> 
       <entity-listener class="com.example.StringCapListener"> 

2: унаследованный метод слушателя

Пусть ваши лица происходят из BaseEntity сортов. Этот базовый класс может реализовать метод прослушивателя, который запускается при обновлении &.

@PrePersist 
    @PreUpdate 
    public void capitalize(BaseEntity o) { 
     // capitalize string attributes 
    } 

Вам понадобится использовать ту же магию отражения, чтобы получить и изменить все строковые атрибуты.

+0

Это именно то, что я искал, спасибо за ответ! –

+0

cool, you welcoome :) – kostja

+0

Я использовал прослушиватель по умолчанию, как вы сказали, все отлично работало с прослушивателем '@ PrePersist', но когда я обновляю объект, он не работает, метод' @ PreUpdate' вызывается нормально, и он корректно изменяет строки, но не обновляет базу данных с измененными значениями, вместо этого она сохраняет объект, как это было до метода '@ PreUpdate', любые идеи о том, как его решить? –

-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 
} 
Смежные вопросы