我需要调用自定义注释实现,但是我的实现没有被调用。 在
在代码片段下方,我有一个包含两个字段(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中保存,而不是通过我的注释实现处理的字符串。
答案 0 :(得分:1)
为了在JPA生命周期事件(如加载,合并,刷新等)上执行代码,您可以使用JPA lifecycle listeners。您可以在实体内或自己的类中定义侦听器回调方法。如果在单个实体类型中使用回调,则侦听器方法很简单。当您需要在不同实体类型上执行某种类型的操作时,请使用侦听器类。
如果您想在存储数据之前操纵数据,可以合并@PreUpdate和@PrePersist回调。
@PreUpdate
@PrePersist
public void convert() {
content += "Processed";
}