【问题标题】:Custom Annotation implementation Hibernate not getting called自定义注释实现休眠没有被调用
【发布时间】: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


【解决方案1】:

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

如果您想在存储数据之前对其进行操作,可以结合使用@PreUpdate@PrePersist 回调。

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

【讨论】:

  • 您好,我每次提交实体时都会调用这个方法,那么它是如何附加客户注释的?你能给我一个很好的例子或链接来学习使用hibernate的自定义注释实现吗?
  • 我使用自定义注释的场景是仅使用注释来加密和解密字符串。我应该怎么做才能执行此操作?我们将不胜感激。请指导我。
  • 我不确定我们是否在同一页面上。在我的回答和 cmets 中,我正在解释 JPA 如何 支持自定义注释。生命周期监听器和回调注释是你可以使用的。
  • 您好,感谢您的评论。所以我不能在 jpa 中使用自定义注释。没有 jpa 有没有其他方法可以执行此操作?如果我使用 mongo 怎么办?
猜你喜欢
  • 2015-12-15
  • 1970-01-01
  • 2011-03-01
  • 2014-10-16
  • 1970-01-01
  • 2012-09-11
  • 2021-11-23
  • 2013-03-06
  • 1970-01-01
相关资源
最近更新 更多