2015-05-11 76 views
1

我在表中有一列(其名稱爲「url」),其值爲URL。有些存儲爲「http://www.test.com」,而其他一些「blogspot.sometest.com」(表格不是我的,順便說一下,所以我不能更改結構)。將SQL列的varchar類型映射到具有Hibernate 4的java.net的java.net.Url映射

在我的項目中,我將「url」列的內容存儲爲結構化對象的java.net.URL類型屬性(例如Page(String name,URL url);)。所以,如果可能的話,我不想修改這個項目。

我想用Hibernate來得到具有特定id的單個記錄。爲例代碼:

@Override 
public T selectRow(Serializable id){ 
    T object = null; 
    try { 
     openSession(); 
     trns = session.beginTransaction(); 
     criteria = session.createCriteria(cl); 
       criteria.add(org.hibernate.criterion.Restrictions.eq("doc_id",id)); 
     //THIS LINE OF CODE LAUNCH THE EXCEPTION: org.hibernate.HibernateException: Unable to convert string [4bid.it] to URL : java.net.MalformedURLException: no protocol: 4bid.it 
     //BECAUSE FOR SOME OF THE URLS THERE IS NO PROTOCOL... 
     List<T> results = criteria.list(); 
     //SAME WITH THIS 
     object = (T) criteria.setFirstResult((Integer) id); 

    //THE NEXT LINE OF CODE WORK BUT RETURN NULL FOR URL WITHOUT THE PROTOCOL 
    object = (T) session.load(cl, id); 
    } catch (RuntimeException e) { 
     if (trns != null) { trns.rollback();} 
     SystemLog.exception(e); 
    } finally { 
     session.flush(); 
     session.close(); 
    } 
    return object; 
} 

所以,我可以創造我的具體的java類實現了一個org.hibenrate.UserType,並嘗試與解決,但我已經存在的UrlType在Hibernate文檔中讀取(https://docs.jboss.org/hibernate/orm/4.2/javadocs/org/hibernate/type/UrlType.html)和這個UrlType只是做varchar和url之間的映射,現在我一定是愚蠢的,但我不明白它如何使用我的程序的java.net.url對象映射表的varchar 。 如果你知道一些截獲hibernate返回的值的技巧,並且只是將字符串「http://」添加到歡迎字符中。

Ty提前。問候。

更新1: 我的問題只是執行兩個SQL查詢蠻力解決方案: 的CRUD操作休眠前:

UPDATE myTable SET url= CONCAT('http://',url) WHERE NOT url like 'http://%'; 

運行所有的Hibernate操作。

的CRUD操作休眠後:

UPDATE myTable SET url = REPLACE(url, 'http://', '') WHERE url LIKE '%http://%'; 

UPDATE2 i'have試圖與@PreUpdate並在setUrl(網址URL)@PrePersist註釋是這樣的:

@PreUpdate 
@PrePersist 
public void setUrl(URL url) { 
    if(url.toString().contains("://")) { 
     this.url = url; 
    }else{ 
     try { 
      this.url = new URL("http://"+url.toString()); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
    } 

現在當我只是進行UPDATE,REMOVE,PERSIST操作時工作的很好,但如果你想要像「@PreLoad」(注意:這個註釋不存在)在s之前將sql值「www.test.com」轉換爲「http://www.test.com」在java對象上觸發我發現的最簡單的事情就是使用hibernate攔截器。

回答

1

UrlType已被支持,它將VARCHAR列映射到java.net.URL屬性。

所有你需要做的是使用一個簡單的映射爲這樣:

@Column(name = "url") 
private URL url; 
+0

是的,你是對的,如果我再補充協議「HTTP://」,以它的做工精細的記錄的值,但我的問題依然存在。你知道如果你可以直接用Hibernate來處理缺乏協議的問題嗎?就像「如果沒有協議,你可以連接返回值與」http:「並保存在對象的映射參數URL?」 – 4535992

+0

嘗試使用@PrePersist和PreUpdate JPA回調修復插入/修改數據。 –

+0

當然,並再次。 – 4535992