Hibernate 3 - 安全地重用 IntegerType/StringType 等对象?
Posted
技术标签:
【中文标题】Hibernate 3 - 安全地重用 IntegerType/StringType 等对象?【英文标题】:Hibernate 3 - safe to reuse IntegerType/StringType etc. objects? 【发布时间】:2019-08-06 18:14:27 【问题描述】:我有一些使用 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
将是静态私有类变量
StringType
和 IntegerType
类型。
我想知道这样做是否安全(例如,从多线程的角度来看,或者纯粹是 从对象重用的角度)。
我注意到在更高版本的 Hibernate 中,他们强制使用 第二种编码方式,但我不确定它是否安全 Hibernate 3 中的这种新模式也是如此。
有什么想法吗?
【问题讨论】:
为什么不用setString()、setInteger()等,会更简单、更干净、更安全。 @JBNizet 因为setInteger
不符合我的需求,所以它不允许我将Integer
null
传递给我正在调用的数据库函数。它需要int
。
【参考方案1】:
StringType 有一个 INSTANCE-Field,其中包含一个您可以重复使用的实例。 Type-Classes 在 Java 和 SQL-Types 之间映射并且没有状态,因此可以重用它们。
【讨论】:
你能用一些代码备份它吗? Docs 不匹配 code on github @XtremeBaumer 您在 Github 上看到的 Hibernate 的下一个版本是 5.x.x。您链接到的文档是 3.2。自 3.2 以来已经过去了很多年,并且进行了许多更改。它于 13 年前的 2006 年推出。 Ups,INSTANCE-Field 是后来添加的。但是可以定义一个常量并重用它。多线程也不是问题,因为该类是无状态的。 常量存在于 3.6 中。只能希望 OP 至少使用的是最新的 3.x 版本。 顺便说一下,Hibernate 自己检测 Strings 和 Integers,所以不需要指定类型。只需使用带有两个参数的 setParameter-Method。【参考方案2】: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;
【讨论】:
"StringType 有成员字段" ...我猜你的意思是:"StringType 有no
成员字段"?顺便说一句,你在这里展示的这段代码......它来自 Hibernate v3 吗?
糟糕。错字。是的。编辑了我的答案。 STingType 没有成员字段。这里的代码来自hibernate 3. (3.3.2.GA)
好的,谢谢。我想这同样适用于 IntegerType?
没错。 IntegerType 也可以安全使用。同理。我查看了hibernate 3.3.2.GA的源代码
好的...谢谢。以上是关于Hibernate 3 - 安全地重用 IntegerType/StringType 等对象?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何使用 HiveWarehouseConnector 安全地重用读取 Hive 表的数据框?
我如何知道何时可以安全地重用来自另一个进程的后台 NSURLSessionConfiguration id?