使用Hibernate 4映射将SQL列的varchar类型映射到java的java.net.Url

时间:2015-05-11 09:37:53

标签: java hibernate url hibernate-mapping hibernate-criteria

我的表(名为" 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拦截器。

1 个答案:

答案 0 :(得分:1)

已支持UrlType,它会将VARCHAR列映射到java.net.URL属性。

您需要做的就是使用简单的映射:

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