休眠3-是否可以重用IntegerType / StringType等对象?

时间:2019-03-15 15:58:46

标签: java hibernate hibernate3

我有一些使用Hibernate 3的代码/应用程序。

它的调用方式如下:
query.setParameter("MRC", getPageName(), new StringType());
query.setParameter("MBID", getMBID(), new IntegerType());

我想用以下代码替换这些调用:
query.setParameter("MRC", getPageName(), STRING_TYPE);
query.setParameter("MBID", getMBID(), INTEGER_TYPE);

这样我就不必实例化这些对象 (第三个参数)。

此处STRING_TYPEINTEGER_TYPE将是静态私有类变量 类型分别为StringTypeIntegerType

我想知道这样做是否安全(例如,从多线程角度来看,还是纯粹从 从对象重用的角度来看)。

我注意到,在更高版本的Hibernate中,他们使用 第二种编码方式,但是我不确定遵循这种方式是否安全 Hibernate 3中也有这种新模式。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

StringType有一个INSTANCE-Field,其中包含可以重用的实例。类型类在Java和SQL类型之间映射,并且没有状态,因此可以重用它们。

答案 1 :(得分:1)

StringType具有 no 成员字段,因此本身没有状态。在源代码中,所有操作要么直接对参数执行,要么处理单例对象。这意味着重用一个单例实例与每次创建一个新实例一样安全。但是,由于单例实例也是不可变的对象(字符串常量,String.class或静态最终int),因此这两种变体都应视为安全的。

这是源代码。

package org.hibernate.type;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

import org.hibernate.dialect.Dialect;

/**
 * <tt>string</tt>: A type that maps an SQL VARCHAR to a Java String.
 * @author Gavin King
 */
public class StringType extends ImmutableType implements DiscriminatorType {

    public Object get(ResultSet rs, String name) throws SQLException {
        return rs.getString(name);
    }

    public Class getReturnedClass() {
        return String.class;
    }

    public void set(PreparedStatement st, Object value, int index) throws     SQLException {
        st.setString(index, (String) value);
    }

    public int sqlType() {
        return Types.VARCHAR;
    }

    public String getName() { return "string"; }

    public String objectToSQLString(Object value, Dialect dialect) throws Exception {
        return '\'' + (String) value + '\'';
    }

    public Object stringToObject(String xml) throws Exception {
        return xml;
    }

    public String toString(Object value) {
        return (String) value;
    }

    public Object fromStringValue(String xml) {
        return xml;
    }

}