我在表中有一列(其名稱爲「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攔截器。
是的,你是對的,如果我再補充協議「HTTP://」,以它的做工精細的記錄的值,但我的問題依然存在。你知道如果你可以直接用Hibernate來處理缺乏協議的問題嗎?就像「如果沒有協議,你可以連接返回值與」http:「並保存在對象的映射參數URL?」 – 4535992
嘗試使用@PrePersist和PreUpdate JPA回調修復插入/修改數據。 –
當然,並再次。 – 4535992