2014-08-27 2 views
1

Мне нужно вызвать пользовательскую реализацию аннотации, но моя реализация не вызвана. ВПользовательская реализация аннотации Hibernate не получает вызов

ниже фрагмента кода, у меня есть профиль Object с двумя полями (id, content). Поле содержимого принимает a строка и

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

Мой объект домен

@Entity 
@Table(name = "profile", catalog = "db") 
public class Profile implements java.io.Serializable{ 

private Integer profileId; 
@ProcessContent(convertor = ProcessContent.class) 
private String content; 

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "PROFILE_ID", unique = true, nullable = false) 

public Integer getProfileId() { 
    return profileId; 
} 
public void setProfileId(Integer profileId) { 
    this.profileId = profileId; 
} 

@Column(name = "CONTENT", unique = true, nullable = false, length = 255) 
public String getContent() { 
    return content; 
} 
public void setContent(String content) { 
    this.content = content; 
} 

}

Мой заказ аннотаций

import java.lang.annotation.Documented; 
import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Documented 
@Target({ ElementType.METHOD, ElementType.FIELD }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ProcessContent { 

    @SuppressWarnings("rawtypes") 
     Class<? extends Object> convertor() default DefaultFieldValueConvertor.class; 
} 

Пример реализации аннотаций. (Обратите внимание, что это образец и сложная логика приходит сюда)

public class DefaultFieldValueConvertor { 

    public Object convert(Object value) { 
     return (value + "Processed"); 
    } 


} 

Tester

Session session = HibernateUtil.getSessionFactory().openSession(); 

     session.beginTransaction(); 
     Profile profile = new Profile(); 
     profile.setContent("OOOOOOOOOPSSSSSSSSS"); 
     session.save(profile); 
     session.getTransaction().commit(); 

     session.close(); 
    } 

Вопрос -> Я могу видеть прохождение строка становится сохранить в БД, а не тот, обрабатываемые с помощью моей реализации аннотаций ,

+0

Почему вы ожидаете, что аннотация будет называться? В коде, который вы опубликовали, нет ничего, чтобы вызвать его. – kostja

+0

Мой фактический сценарий немного сложный. Мне нужно, чтобы мой вопрос был прост. Мне нужно иметь аннотацию, которая является общей для всех объектов домена и запускать ее непосредственно перед сохранением. Но мне нужно исходное значение перед процессом для другой работы, которую я делаю на уровне перехватчика спящего режима. Мой вопрос: почему реализация, определенная в DefaultFieldValueConvertor, не вызвана? – vin

+0

Что я имею в виду - какой механизм должен запускать обработку аннотаций? Почему вы ожидаете, что JPA сделает это при сохранении, а не, скажем, обновлении или загрузке? JPA не обрабатывает случайные аннотации - у него есть набор, который он ищет, и оставляет всех остальных. – kostja

ответ

1

Для выполнения кода на событиях жизненного цикла JPA, таких как загрузка, слияние, обновление и т. Д., Вы можете использовать JPA lifecycle listeners. Вы можете определить методы обратного вызова слушателя внутри вашего объекта или в собственном классе. Если вы используете обратный вызов в одном типе сущности, методы прослушивателя - это простой способ. Используйте классы слушателя, когда вам нужен определенный тип операций, которые должны выполняться для разных типов сущностей.

Если вы хотите управлять данными перед их хранением, вы можете комбинировать обратные вызовы @PreUpdate и @PrePersist.

@PreUpdate 
@PrePersist 
public void convert() { 
    content += "Processed"; 
} 
+0

Привет, этот метод называется каждый раз, когда я отправляю объект, так как он связан с аннотацией custome?Можете ли вы предоставить мне хороший пример или ссылку для изучения пользовательской реализации аннотации с помощью спящего режима. – James

+0

Мой сценарий использования пользовательской аннотации заключается в шифровании и расшифровке строки, используя только аннотацию. Что мне делать, чтобы выполнить это? Любая помощь была бы признательна. пожалуйста, направляйте меня. – James

+1

Я не уверен, что мы здесь на одной странице. В своем ответе и комментариях я объясняю, как JPA делает ** не ** поддержку пользовательских аннотаций. Слушатели жизненного цикла и аннотации обратного вызова - это все, что вы можете использовать. – kostja