Hibernate ClassCastException quando dou update/insert/delete

Olá,

está oc orrendo o seguinte erro:

11:16:28,654 INFO  [STDOUT] Caused by: java.lang.ClassCastException: java.lang.Integer

11:16:28,654 INFO  [STDOUT]    at org.hibernate.type.DoubleType.set(DoubleType.java:34)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:62)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:39)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.persister.entity.BasicEntityPersister.dehydrate(BasicEntityPersister.java:1617)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.persister.entity.BasicEntityPersister.update(BasicEntityPersister.java:1963)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.persister.entity.BasicEntityPersister.updateOrInsert(BasicEntityPersister.java:1909)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.persister.entity.BasicEntityPersister.update(BasicEntityPersister.java:2149)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:75)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:137)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:324)

11:16:28,654 INFO  [STDOUT]    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)

11:16:28,654 INFO  [STDOUT]    at br.fapesp.tidia.ae.infra.mail.impl.MailDAO.updateMessagesState(MailDAO.java:319)

11:16:28,654 INFO  [STDOUT]    ... 73 more

Quando tento executar o seguinte código:

Session session = null;
        Transaction tx = null;
        try {
            SessionFactory factory = ServiceLocator.getInstance().getSessionFactory();
            session = factory.openSession();
            tx = session.beginTransaction();

            Iterator it = messageList.iterator();
            while (it.hasNext()) {
                MessageModel message = (MessageModel) it.next();

                Query query = session
                    .createQuery("from MessageStatusModel as ms where  ms.folder = :id_folder " +
                                    " and ms.user = :id_user and ms.message = :id_message");
                query.setLong("id_folder", folder.getId());
                query.setLong("id_user", user.getId());
                query.setLong("id_message", message.getId());

                MessageStatusModel messageStatus = (MessageStatusModel)query.uniqueResult();
                // updating message folder
                messageStatus.setFolder(targetFolder);
                session.update(messageStatus);
            }

            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            throw new SystemException(e);
        } catch (Exception e) {
            throw new SystemException(e);
        } finally {
            session.close();
        }

com a seguinte classe/mapeamento:

public class MessageStatusModel extends ObjectVO {

    public static final int READ = 0;
    public static final int UNREAD = 1;
	public static final int REPLY = 2;
	public static final int FORWARD = 3;
	public static final int SENT = 4;
	public static final int DELETED = 5;

    private int  status = -1;
    private MessageModel message;
    private FolderModel folder;
    private UserModel user;

    public MessageStatusModel() {
        //empty
    }

// getters and setters padrões:
//...
}
<hibernate-mapping>
    <class
        name="br.fapesp.tidia.ae.common.mail.model.MessageStatusModel"
        table="message_status"
        dynamic-update="false"
        dynamic-insert="false" >

        <id
            name="id"
            column="id"
            type="long">
            <generator class="increment"/>
        </id>

        <property
            name="status"
            update="true"
            insert="true"
            access="property"
            column="msg_status"
        />

		<many-to-one name="folder" class="br.fapesp.tidia.ae.common.mail.model.FolderModel" column="id_folder"  lazy="false"/>
		<many-to-one name="message" class="br.fapesp.tidia.ae.common.mail.model.MessageModel" column="id_message" lazy="false" />
		<many-to-one name="user" class="br.fapesp.tidia.ae.common.shared.model.UserModel" column="id_user" lazy="false" />


    </class>

</hibernate-mapping>
public abstract class ObjectVO implements Serializable {
    private long id;

    public ObjectVO(long id) {
        setId(id);
    }

    public ObjectVO() {

    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id=id;
    }

}

Alguma luz ?

muda seu id de long para Long.

Samuel,

dê uma olhada na definição da sua variável targetFolder…

como é o único atributo q vc está alterando, pode ser q ele não esteja compatível com a definição do campo no mapeamento ou na tabela.

Abraço

Quanto ao id ser long e não Long, não tem problema porque tenho outra classe (FolderModel) que está funcionando direitinho com o id sendo long.

O a variável targetFolder é do tipo correto sim… omiti a assinatura do método, mas ela é do tipo FolderModel mesmo…

Samuel,

vi um problema parecido no fórum do Hibernate hoje…

http://forum.hibernate.org/viewtopic.php?t=944800

Se vc não resolveu, por favor, poste o conteúdo completo de sua classe MessageStatusModel. Se resolveu, fale pra galera o q foi…

Abraço.

Não sei o porque mas quando dou update no messageStatusModel, ele tenta fazer o update de message (mesmo colocando o update=“false” no HBM), então, e o message tinha um tipo de variável que não batia com a declarada no banco :slight_smile: Era isto…

Valeu!
Ah! só para constar, eu odeio o HIBERNATE! ô mapeamentozinho chato!

Só para constar, talvez seja bom usar o Hibernate Tools, ou XDoclet, ou Middlegen, etc.

valeuz…