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_TYPEINTEGER_TYPE 将是静态私有类变量 StringTypeIntegerType 类型。

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

我注意到在更高版本的 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 有 no 成员字段,因此本身没有状态。在源代码中,所有操作要么直接在参数上执行,要么处理单例对象。这意味着重用一个单例实例与每次创建一个新实例一样安全。但是,由于单例实例也是不可变对象(字符串常量、String.class 或静态 final 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;
    


【讨论】:

"StringType 有成员字段" ...我猜你的意思是:"StringType 有no 成员字段"?顺便说一句,你在这里展示的这段代码......它来自 Hibernate v3 吗? 糟糕。错字。是的。编辑了我的答案。 STingType 没有成员字段。这里的代码来自hibernate 3. (3.3.2.GA) 好的,谢谢。我想这同样适用于 IntegerType? 没错。 IntegerType 也可以安全使用。同理。我查看了hibernate 3.3.2.GA的源代码 好的...谢谢。

以上是关于Hibernate 3 - 安全地重用 IntegerType/StringType 等对象?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的CRUD重用性

我们如何使用 HiveWarehouseConnector 安全地重用读取 Hive 表的数据框?

我如何知道何时可以安全地重用来自另一个进程的后台 NSURLSessionConfiguration id?

何时可以安全地重写和重用 MTLBuffer 或其他 Metal 顶点缓冲区?

如何在 C++ 中安全地实现可重用的暂存存储器?

可以安全地重用 MD5CryptoServiceProvider 来计算多线程代码中的 md5 哈希吗?