Ошибка при установке сгенерированного идентификатора в спящем режиме

У меня есть 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 ответа

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

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

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

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

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

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

Другие вопросы по тегам