Ошибка при установке сгенерированного идентификатора в спящем режиме - PullRequest
0 голосов
/ 22 июня 2011

У меня есть Student объект, который мне нужно сохранить в базе данных. Идентификатор: studentId определяется как в HBM: -

        <id name="studentId" type="long">
            <column name="ST_ID" />
            <generator class="native" />
        </id>

Теперь для генерации идентификатора я написал код, который я в основном реализовал, так же, как он присутствовал в Hibernate Source, как показано ниже:

// fetching the entity persister for the entity
EntityPersister persister = 
    ((SessionImpl)session.).getEntityPersister(entity.getClass().getName(), entity);

// get the model 
PersistentClass model = configuration.getClassMapping(persister.getEntityName());

// cache concurrency
CacheConcurrencyStrategy strategy = persister.getCache();
Class persiterClass = model.getEntityPersisterClass();

SessionFactoryImpl  sessionFactoryImpl = 
            (SessionFactoryImpl) session.getSessionFactory();

if(persiterClass == null) {     
    persister = new SingleTableEntityPersister(model, strategy, sessionFactoryImpl)
}

this.id = persister.getIdentifierGenerator().generate((SessionImpl)session, entity);

persister.setIdentifier(entity, id, EntityMode.POJO);

Теперь, когда я достигаю строки кода persister.setIdentifier(entity, id, EntityMode.POJO);, я получаю следующее исключение: -

IllegalArgumentException in class:
com.school.class.Student, setter method of property: studentId
org.hibernate.property.BasicPropertyAccessor$BasicSetter set
SEVERE: expected type: long, actual value: org.hibernate.id.IdentifierGeneratorFactory$2
org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of com.school.class.Student.studentId
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:104)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.setIdentifier(AbstractEntityTuplizer.java:211)
    at org.hibernate.persister.entity.AbstractEntityPersister.setIdentifier(AbstractEntityPersister.java:3601)
    at com.school.class.Student.<init>(Student.java:140)

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

Спасибо

Ответы [ 3 ]

1 голос
/ 22 июня 2011

Некоторые генераторы не могут сгенерировать идентификатор до фактической вставки, поэтому они возвращают специальный маркерный объект из метода generate().Этот объект указывает, что Hibernate должен получить идентификатор другим способом, используя метод PostInsertIdentifierGenerator.getInsertGeneratedIdentifierDelegate().

0 голосов
/ 24 июня 2011

В файле HBM я упомянул генератор как <generator class="native" />, с которым он не работал, затем я попытался с <generator class="increment"/>, я не знаю точную причину, но он работал правильно с этим.

Мне кажется, что правильная причина может быть в том, что генератор идентификатора был POST_INSERT_INDICATOR, что, как я чувствую, означает, что идентификатор будет сгенерирован после того, как объект будет вставлен в базу данных, тогда как я пытался сгенерировать его перед вставкой вот причина, по которой он терпел неудачу.

Я даже пытался с другими генераторами идентификаторов, См. Это , я пытался uuid, assigned, increment, sequence и hilo, они работали правильно, но native & identity, не удалось с той же проблемой.

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

0 голосов
/ 22 июня 2011

Эта ошибка вызвана тем, что класс Student не имеет метода setStudentId{Long id)

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