Hibernate 3 - 可以安全地重用IntegerType / StringType等对象吗?

问题描述 投票:1回答:2

我有一些使用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);

这样我每次都不必实例化这些对象(第3个参数)。

这里STRING_TYPEINTEGER_TYPE将分别是StringTypeIntegerType类型的静态私有类变量。

我想知道这是否安全(例如从多线程角度,或纯粹从对象重用角度)。

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

有任何想法吗?

java hibernate hibernate3
2个回答
1
投票

StringType具有<edited> no </ edited>成员字段,因此没有状态本身。在源代码中,所有操作都可以直接在参数上执行,也可以处理单例对象。这意味着重用单例实例与每次创建新实例一样安全。但是,由于单例实例也是不可变对象(字符串常量,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;
    }

}

2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.