2014-08-27 96 views
1

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

下面的代码段,我有一个配置文件对象有两个字段(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(); 
    } 

问题 - >我可以看到经过串DB得到保存,而不是一个通过我的注释执行处理。

+0

你为什么期望标注被调用?您发布的代码中没有任何内容可以触发它。 – kostja 2014-08-27 10:39:59

+0

我的实际情况有点复杂。我需要保持我的问题简单。我需要一个对所有域对象通用的注释,并在保存之前触发它。但是我需要在进行其他工作之前的原始值,这是我在hibernate拦截器级别所做的工作。我的问题是为什么在DefaultFieldValueConvertor中定义的实现没有被调用? – vin 2014-08-27 10:45:20

+0

我的意思是 - 什么机制应该触发注释处理?你为什么期望JPA保存,而不是更新或加载? JPA不处理随机注释 - 它有一套它寻找和留下所有其他人。 – kostja 2014-08-27 10:49:00

回答

1

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

如果要在存储数据之前处理数据,可以合并@PreUpdate@PrePersist回调。

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

嗨,这个方法每次调用时我提交的实体,所以它如何附加custome注释?你能否给我提供一个很好的例子或链接来学习使用hibernate的自定义注释实现。 – James 2015-06-29 19:36:46

+0

我使用自定义注释的场景是仅使用注释来加密和解密字符串。我该怎么做才能做到这一点?任何帮助,我们会感激。请指导我。 – James 2015-06-29 19:50:55

+1

我不确定我们在这里的同一页上。在我的回答和评论中,我正在解释JPA如何不支持自定义注释。生命周期监听器和回调注释是你可以使用的。 – kostja 2015-06-29 20:32:53