[英]Hibernate 3 - safe to reuse IntegerType/StringType etc. objects?
我有一些使用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_TYPE
和INTEGER_TYPE
將類型的靜態專用類變量StringType
和IntegerType
分別。
我想知道這樣做是否安全(例如從多線程角度,或純粹從對象重用角度)。
我注意到在后來的Hibernate版本中他們使用了第二種編碼方式,但我不確定在Hibernate 3中是否也可以安全地使用這種新模式。
有任何想法嗎?
StringType有一個INSTANCE-Field,它包含一個可以重用的實例。 Type-Classes在Java和SQL-Types之間映射並且沒有狀態,因此可以重用它們。
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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.