Hibernate 3 - 重用 IntegerType/StringType 等对象安全吗?
Hibernate 3 - safe to reuse IntegerType/StringType etc. objects?
我有一些 code/application 使用 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_TYPE
和INTEGER_TYPE
将是静态私有class变量
类型分别为 StringType
和 IntegerType
。
我想知道这样做是否安全(例如,从多线程的角度来看,或者纯粹
从对象重用的角度)。
我注意到在更高版本的 Hibernate 中他们强制使用
第二种编码方式,但我不确定遵循它是否安全
Hibernate 3 中也有这种较新的模式。
有什么想法吗?
StringType 有一个 INSTANCE-Field,其中包含一个您可以重复使用的实例。 Java 和 SQL 类型之间的 Type-类 映射并且没有状态,因此可以重用它们。
StringType 没有 成员字段,因此本身没有状态。在源代码中,所有操作要么直接对参数执行,要么处理单例对象。这意味着重用单例实例与每次创建新实例一样安全。但是,由于单例实例也是不可变对象(字符串常量 String.class 或静态最终整数),因此这两种变体都应该被认为是安全的。
这是源代码。
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;
}
}
我有一些 code/application 使用 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_TYPE
和INTEGER_TYPE
将是静态私有class变量
类型分别为 StringType
和 IntegerType
。
我想知道这样做是否安全(例如,从多线程的角度来看,或者纯粹 从对象重用的角度)。
我注意到在更高版本的 Hibernate 中他们强制使用 第二种编码方式,但我不确定遵循它是否安全 Hibernate 3 中也有这种较新的模式。
有什么想法吗?
StringType 有一个 INSTANCE-Field,其中包含一个您可以重复使用的实例。 Java 和 SQL 类型之间的 Type-类 映射并且没有状态,因此可以重用它们。
StringType
这是源代码。
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;
}
}