【发布时间】:2014-08-27 10:18:10
【问题描述】:
我需要调用自定义注释实现,但我的实现没有被调用。 在
在代码 sn-p 下方,我有一个带有两个字段(id、内容)的配置文件对象。内容字段接受 一个字符串和
需要在运行时通过自定义注解更改内容。
我的域对象
@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();
}
问题 -> 我可以看到传递的字符串保存在数据库中,而不是通过我的注释实现处理的字符串。
【问题讨论】:
-
为什么要调用注解?您发布的代码中没有任何内容可以触发它。
-
我的实际情况有点复杂。我需要保持我的问题简单。我需要一个对所有域对象都通用的注释,并在保存之前触发它。但是我在处理我在休眠拦截器级别所做的其他工作之前需要原始值。我的问题是为什么 DefaultFieldValueConvertor 中定义的实现没有被调用?
-
我的意思是——应该用什么机制来触发注释处理?为什么您希望 JPA 在保存时执行此操作,而不是说更新或加载? JPA 不处理随机注释 - 它有一组它会查找并保留所有其他注释。
-
我的印象是 JPA 将处理自定义注释及其实现。在这种情况下,我必须编写代码来寻找它们的存在并采取行动。我可以通过反射寻找注释。然后呼吁采取必要的行动。
-
也许使用 JPA 生命周期侦听器对您来说是一个更合适的选择。在我将其发布为答案之前,我想重申您的问题,以查看我是否理解正确:当存储/加载/合并等实体实例时,您想要更改某些属性。
标签: hibernate annotations