Hibernate 3 - безопасно ли повторно использовать объекты IntegerType / StringType и т. Д.? - PullRequest
1 голос
/ 15 марта 2019

У меня есть код / ​​приложение, которое использует 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 они использовали 2-й способ кодирования, но я не уверен, что безопасно следовать этот более новый шаблон в Hibernate 3.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

StringType имеет поле INSTANCE, которое содержит экземпляр, который вы можете использовать повторно. Классы типов сопоставляются между типами Java и SQL и не имеют состояния, поэтому их можно использовать повторно.

1 голос
/ 22 марта 2019

StringType имеет нет полей-членов и, следовательно, не имеет самого состояния. В исходном коде все операции выполняются либо непосредственно над параметрами, либо имеют дело с одноэлементными объектами. Это означает, что повторное использование одноэлементного экземпляра так же безопасно, как и создание нового экземпляра каждый раз. Однако, поскольку экземпляры-одиночки также являются неизменяемыми объектами (строковая константа, 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;
    }

}
...