Hibernate 3 — безопасно ли повторно использовать объекты типа IntegerType / StringType и т.д.?

#java #hibernate #hibernate3

#java #переход в спящий режим #hibernate3

Вопрос:

У меня есть некоторый код / приложение, которое использует 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.

Есть идеи?

Комментарии:

1. Почему вы не используете setString(), setInteger() и т.д. Это было бы проще, чище и безопаснее.

2.@JBNizet Поскольку setInteger это не соответствует моим потребностям, это не позволяет мне передавать Integer null вызываемую мной функцию DB. Для этого требуется int .

Ответ №1:

StringType имеет поле ЭКЗЕМПЛЯРА, которое содержит экземпляр, который вы можете повторно использовать. Классы типов сопоставляются между типами Java и SQL и не имеют состояния, поэтому их можно использовать повторно.

Комментарии:

1. Можете ли вы создать резервную копию этого с помощью какого-нибудь кода? Документы не соответствуют коду на github

2. @XtremeBaumer Следующая версия Hibernate, которую вы просматриваете на Github, — 5.x.x. Документация, на которую вы ссылаетесь, — 3.2. С версии 3.2 прошло много лет, и было внесено много изменений. Он вышел в 2006 году, 13 лет назад.

3. Ups, поле ЭКЗЕМПЛЯРА было добавлено позже. Но можно определить константу и повторно использовать ее. Многопоточность также не является проблемой, поскольку класс не имеет состояния.

4. Константы существуют в версии 3.6. Остается только надеяться, что операционная система использует по крайней мере последнюю версию 3.x .

5. Кстати, Hibernate сам определяет строки и целые числа, поэтому нет необходимости указывать тип. Просто используйте setParameter-метод с двумя параметрами.

Ответ №2:

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

}
  

Комментарии:

1. «У StringType есть поля-члены» … Полагаю, вы имели в виду: «StringType имеет no поля-члены»? Кстати, этот код, который вы показали здесь … он из Hibernate v3?

2. Упс. Опечатка. ДА. Отредактировал мой ответ. У StringType нет полей-членов. Приведенный здесь код взят из hibernate 3. (3.3.2.GA )

3. Хорошо, спасибо. Я думаю, то же самое относится и к IntegerType?

4. Точно. IntegerType также безопасен в использовании. То же обоснование. Я просмотрел исходный код для hibernate 3.3.2.GA

5. ОК… Спасибо.