Hibernate - Программная конфигурация - PullRequest
1 голос
/ 30 ноября 2008

Я пытаюсь настроить классы Hibernate не через XML / Annotation, а используя их программный API:

Mappings mappings = configuration.createMappings();
    mappings.addClass(...);

Пример добавления столбца:

public void addColumn(String colName, String accessorName, NullableType type)
      {
        if(this._table == null)
          {
            return;
          }

        Column column = new Column(colName);
//        this._table.addColumn(column);

        Property prop = new Property();
        prop.setName(accessorName);

        SimpleValue simpleValue = new SimpleValue();
        simpleValue.setTypeName(type.getName());
        simpleValue.addColumn(column);
        simpleValue.setTable(_table);
        prop.setValue(simpleValue);

        this._rootClass.addProperty(prop);
      }

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

 ERROR:  java.lang.NullPointerException
    at
 org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:711)

Я проверил по исходному коду (я использую Hibernate 3.3.1 GA), и в PersistentClass есть строка, строка 711:

protected void checkColumnDuplication() {
    HashSet cols = new HashSet(); <=========After this line 'cols' already contain data!
    if (getIdentifierMapper() == null ) {
        //an identifier mapper => getKey will be included in the getNonDuplicatedPropertyIterator()
        //and checked later, so it needs to be excluded
        checkColumnDuplication( cols, getKey().getColumnIterator() );
    }
    checkColumnDuplication( cols, getDiscriminatorColumnIterator() );
    checkPropertyColumnDuplication( cols, getNonDuplicatedPropertyIterator() );
    Iterator iter = getJoinIterator();
    while ( iter.hasNext() ) {
        cols.clear();
        Join join = (Join) iter.next();
        checkColumnDuplication( cols, join.getKey().getColumnIterator() );
        checkPropertyColumnDuplication( cols, join.getPropertyIterator() );
    }
}

Кто-нибудь пытался настроить его таким образом, была такая же проблема? ...

Заранее спасибо

1 Ответ

1 голос
/ 09 декабря 2009

Ваш нулевой указатель потому, что вы не дали объекту RootClass имя Entity - вам просто нужно вызвать setEntityName корневого класса, и вы получите исходное исключение.

Вам также необходимо определить значение идентификатора в корневом классе - просто вызовите setIdentifier, используя значение, которое вы хотите сделать своим идентификатором. (Не вызывайте addProperty с этим, иначе он будет жаловаться на дублирование столбцов).

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