2014-08-27 101 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