Note that there are some explanatory texts on larger screens.

plurals
  1. POWhy does Hibernate throw a ClassCastException when calling session.save(object)?
    primarykey
    data
    text
    <p>When I do the following Hibernate call I get a ClassCastException (see Stacktrace) but I have problems to understand why. What's Hibernate trying to do here? Is it trying to cast one of my objects to a different class type? If yes, why and to what class?</p> <pre><code>session.save(fooAccount); </code></pre> <p><strong>Stacktrace:</strong></p> <pre><code>com.foo.web.model.exception.FailedDatabaseOperationException: java.lang.ClassCastException: com.foo.web.model.authentication.SecurePassword at com.foo.web.controller.db.HibernateController.savefooAccount(HibernateController.java:883) at com.foo.web.model.account.fooAccount.save(fooAccount.java:459) at com.foo.web.controller.AccountController.createfooAccount(AccountController.java:258) at com.foo.web.view.start.RegisterController.register(RegisterController.java:233) at com.foo.web.view.start.RegisterController.onClick$btn_register(RegisterController.java:196) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.zkoss.zk.ui.event.GenericEventListener.onEvent(GenericEventListener.java:81) at org.zkoss.zk.ui.impl.EventProcessor.process0(EventProcessor.java:192) at org.zkoss.zk.ui.impl.EventProcessor.process(EventProcessor.java:138) at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.process0(EventProcessingThreadImpl.java:517) at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.sendEvent(EventProcessingThreadImpl.java:121) at org.zkoss.zk.ui.event.Events.sendEvent(Events.java:319) at org.zkoss.zk.ui.event.Events.sendEvent(Events.java:329) at org.zkoss.zk.ui.AbstractComponent$ForwardListener.onEvent(AbstractComponent.java:3034) at org.zkoss.zk.ui.impl.EventProcessor.process0(EventProcessor.java:192) at org.zkoss.zk.ui.impl.EventProcessor.process(EventProcessor.java:138) at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.process0(EventProcessingThreadImpl.java:517) at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.run(EventProcessingThreadImpl.java:444) Caused by: java.lang.ClassCastException: com.foo.web.model.authentication.SecurePassword at org.hibernate.type.ComponentType.toLoggableString(ComponentType.java:410) at org.hibernate.type.ComponentType.toLoggableString(ComponentType.java:414) at org.hibernate.pretty.Printer.toString(Printer.java:76) at org.hibernate.pretty.Printer.toString(Printer.java:113) at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:120) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133) at com.foo.web.controller.db.HibernateController.savefooAccount(HibernateController.java:879) </code></pre> <hr> <p><strong>Edit:</strong> Here are the mappings as well as the code that stores the object:</p> <p><strong>Mapping file</strong> (shortened version. Irrelevant stuff omitted):</p> <pre><code>&lt;?xml version="1.0"?&gt; &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"&gt; &lt;!-- Generated 26.04.2011 14:49:15 by Hibernate Tools 3.3.0.GA --&gt; &lt;hibernate-mapping&gt; &lt;class name="com.foo.web.model.account.fooAccount" table="fooACCOUNT"&gt; &lt;id name="id" type="long" access="field"&gt; &lt;column name="foo_ACCOUNT_ID" /&gt; &lt;generator class="native" /&gt; &lt;/id&gt; &lt;many-to-one name="defaultMailAccount" lazy="false" column="DEFAULT_MAIL_ACCOUNT_ID" /&gt; &lt;bag name="mailAccounts" table="MAILACCOUNTS" lazy="false" inverse="true"&gt; &lt;key column="foo_ACCOUNT_ID"&gt;&lt;/key&gt; &lt;one-to-many class="com.foo.web.model.mail.account.MailAccount" /&gt; &lt;/bag&gt; &lt;component name="user" class="com.foo.web.model.account.fooUser"&gt; &lt;component name="activationCode"&gt; &lt;property name="activationCode" column="ACTIVATION_CODE"&gt;&lt;/property&gt; &lt;/component&gt; &lt;component name="password" class="com.foo.web.model.authentication.MediumSecurePassword"&gt; &lt;property name="hash" column="PASSWORD" /&gt; &lt;/component&gt; &lt;component name="resetCode"&gt; &lt;property name="resetCode" column="RESET_CODE" /&gt; &lt;/component&gt; &lt;one-to-one name="fooAccount" class="com.foo.web.model.account.fooAccount"&gt;&lt;/one-to-one&gt; &lt;component name="username"&gt; &lt;property name="username" column="USERNAME" unique="true" /&gt; &lt;/component&gt; &lt;property name="userStatus"&gt; &lt;column name="USERSTATUS" /&gt; &lt;type name="org.hibernate.type.EnumType"&gt; &lt;param name="type"&gt;12&lt;/param&gt; &lt;param name="enumClass"&gt;com.foo.web.model.account.UserStatus&lt;/param&gt; &lt;/type&gt; &lt;/property&gt; &lt;property name="userType"&gt; &lt;column name="USERTYPE" /&gt; &lt;type name="org.hibernate.type.EnumType"&gt; &lt;param name="type"&gt;12&lt;/param&gt; &lt;param name="enumClass"&gt;com.foo.web.model.account.UserType&lt;/param&gt; &lt;/type&gt; &lt;/property&gt; &lt;/component&gt; &lt;/class&gt; &lt;/hibernate-mapping&gt; </code></pre> <p><strong>SecurePassword.java</strong> (shortened)</p> <pre><code>/** * Represents a password. */ public class SecurePassword extends Password { /** * Default constructor */ public SecurePassword() { super(); } /** * Constructor method. Will throw IllegalPasswordException if password is * not safe. */ public SecurePassword(String password) throws IllegalPasswordException { setPassword(password); } /** * Checks if the given character is a number * * @param c * The character to check * @return Returns true if the given character is a number */ public boolean isNumber(char c) { // ... } /** * Checks is a given password is valid. */ public boolean passwordValid(Password password) throws IllegalPasswordException { return passwordValid(password.toString()); } /** * Checks is a given password is valid. */ public boolean passwordValid(String password) throws IllegalPasswordException { // ... } /** * Sets a new password. */ @Override public void setPassword(String password) throws IllegalPasswordException { if (passwordValid(password)) { this.password = password; } } } </code></pre> <p><strong>Password.java</strong> (shortened)</p> <pre><code>/** * Represents a simple password without much restriction */ public class Password { Crypter crypter = new Crypter(); String hash = null; String password = null; public Password() { super(); } public Password(String password) throws IllegalPasswordException { setPassword(password); } @Override public boolean equals(Object password) { if (this == password) { return true; } if (password instanceof Password) { Password p = (Password) password; return getHash().equals(p.getHash()); } if (password instanceof String) { String password_str = getPassword(); if (password_str != null) { return password_str.equals(password); } } return false; } /** * Returns the hashed version of this password * * @return The hashed version of this password */ public String getHash() { if (hash == null) { try { hash = crypter.hash(getPassword()); } catch (FailedCryptOperationException e) { handleException(e, false, null, null); } } return hash; } public String getPassword() { return password; } /* * Handles the given exception */ private void handleException(Exception e, boolean notifyUser, String customTitle, String customErrorMessage) { SystemController.handleException(e, notifyUser, customTitle, customErrorMessage); } public void setHash(String hash) { this.hash = hash; } @SuppressWarnings("unused") public void setPassword(String password) throws IllegalPasswordException { hash = null; this.password = password; } @Override public String toString() { return getPassword(); } } </code></pre> <p><strong>MediumSecurePassword.java</strong></p> <pre><code>public class MediumSecurePassword extends SecurePassword { public final int MAX_LENGTH = 64; public final int MIN_LENGTH = 6; StringUtil stringUtil = new StringUtil(); public MediumSecurePassword() { super(); } /** * Constructor method. Will throw IllegalPasswordException if password is * not safe. Medium Safe passwords are at least 6 characters long. */ public MediumSecurePassword(String password) throws IllegalPasswordException { setPassword(password); } /** * Checks if the given character is a number */ public boolean isNumber(char c) { // ... } /** * Checks is a given password is valid. Valid means that it's secure (at * least 8 characters, at least 1 number, at least 1 special character). */ public boolean passwordValid(Password password) throws IllegalPasswordException { return passwordValid(password.toString()); } /** * Checks is a given password is valid. Valid means that it's "medium secure" (min. * length of 6). */ public boolean passwordValid(String password) throws IllegalPasswordException { // ... } /** * Sets a new password. Will throw IllegalPasswordException if password is * not safe. Safe passwords are at least 8 characters long, consist of * numbers, letters and special characters. */ @Override public void setPassword(String password) throws IllegalPasswordException { if (passwordValid(password)) { this.password = password; } } } </code></pre> <hr> <p><strong>Note:</strong> If I remove these 3 lines from my mapping file everything runs smoothly:</p> <pre><code>&lt;component name="password" class="com.foo.web.model.authentication.MediumSecurePassword"&gt; &lt;property name="hash" column="PASSWORD" /&gt; &lt;/component&gt; </code></pre> <p>So, for me there seems to be a problem with getting the password's hash value via <code>passwordInstance.getHash()</code>? Not sure though.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload