我的表(名为" url")在一个值为URL的表中。有些存储为" http://www.test.com
"而另一些则是#34; blogspot.sometest.com
" (顺便说一句,这个表不是我的,所以我不能改变结构)。
在我的项目中,我存储了" url"的内容。 column作为结构化对象的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;
}
所以,我可以为实现一个org.hibenrate.UserType创建我的特定java类,并试着解决它,但我读了已经存在UrlType(https://docs.jboss.org/hibernate/orm/4.2/javadocs/org/hibernate/type/UrlType.html)和这个UrlType的hibernate文档只是做varchar和url之间的映射,现在我必须是愚蠢的,但我不知道如何使用它来映射我的programm的java.net.url对象的表的varchar。 无论如何你知道拦截从hibernate返回的值的一些技巧,只需追加字符串&#34; http://&#34;对此表示欢迎。
提前Ty。问候。更新1: 我的问题的一个强力解决方案就是执行两个SQL查询: 在CRUD休眠操作之前:
UPDATE myTable SET url= CONCAT('http://',url) WHERE NOT url like 'http://%';
运行所有Hibernate操作。
CRUD Hibernate操作后:
UPDATE myTable SET url = REPLACE(url, 'http://', '') WHERE url LIKE '%http://%';
UPDATE2 我已经在setUrl(Url url)上尝试使用@PreUpdate和@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操作即可正常工作,但如果你想要&#34; @ PreLoad&#34; (注意:这个注释不存在)用于转换sql值&#34; www.test.com&#34;到&#34; http://www.test.com&#34;在java对象上存储之前,我发现最简单的事情就是使用一个hibernate拦截器。
答案 0 :(得分:1)