自定义Annotation实现Hibernate没有被调用

时间:2014-08-27 10:18:11

标签: hibernate annotations

我需要调用自定义注释实现,但是我的实现没有被调用。 在

在代码片段下方,我有一个包含两个字段(id,content)的配置文件对象。内容字段接受 一个字符串和

需要通过自定义注释在运行时更改内容。

我的域名对象

@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");
    }


}

测试员

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

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

        session.close();
    }

问题 - &gt;我可以看到传递的字符串在DB中保存,而不是通过我的注释实现处理的字符串。

1 个答案:

答案 0 :(得分:1)

为了在JPA生命周期事件(如加载,合并,刷新等)上执行代码,您可以使用JPA lifecycle listeners。您可以在实体内或自己的类中定义侦听器回调方法。如果在单个实体类型中使用回调,则侦听器方法很简单。当您需要在不同实体类型上执行某种类型的操作时,请使用侦听器类。

如果您想在存储数据之前操纵数据,可以合并@PreUpdate@PrePersist回调。

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