Создание пользовательского Hibernate UserType: узнайте имя текущей таблицы сущностей - PullRequest
1 голос
/ 23 марта 2009

Я пишу Hibernate CompositeUserType, и для сериализации пользовательского объекта в JDBC мне нужно знать имя таблицы, которую я обновляю (потому что есть некоторая конфигурация для моего инструмента, прикрепленного к таблице).

Единственный способ сделать эту работу прямо сейчас - это явная параметризация моего UserType с помощью имени таблицы сущностей, которая является избыточной и подверженной ошибкам.

Есть ли способ получить эту информацию в "nullSafeSet"?

public void nullSafeSet(PreparedStatement ps, Object value, int index,
        SessionImplementor session) 
        throws HibernateException, SQLException {

    // find out the entity table name here

Если нет, есть ли способ получить определение владельца во время инициализации типа пользователя (аналогично тому, как передаются параметры)?

1 Ответ

1 голос
/ 23 марта 2009

Я сделал нечто подобное, когда мне нужно было установить свойство для пользовательского типа во время выполнения на основе некоторых других настроек. Используя Конфигурацию, вы можете перейти к пользовательскому типу для динамического задания свойства, например:

for (Iterator iter=configuration.getClassMappings(); iter.hasNext();) {
  PersistentClass pc = (PersistentClass)iter.next();
  for (Iterator iter2=pc.getPropertyIterator(); iter2.hasNext();) {
    Property property = (Property)iter2.next();
    if (property.getType().getName().equals("your custom type")) {
      SimpleValue v = (SimpleValue)property.getValue();
      v.getTypeParameters().setProperty("table property", pc.getTable().getName());
    }
  }
}

Очевидно, здесь много предположений (одна таблица на сущность, пользовательский тип - это одно свойство и т. Д.), Но это должно сработать.

Другой возможностью, которую я не пробовал, является использование метаданных PreparedStatement в методе nullSafeSet, например: Statement.getMetaData (). GetTableName (index).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...