Hibernate version: 3.2
Mapping documents:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="com.kf.businessobject.impl.UserImpl"
table="user" >
<id name="id"
type="java.lang.Integer"
column="user_id" >
<generator class="identity" />
</id>
<property name="username"
type="java.lang.String"
column="user_name" />
<property name="createDate"
type="java.sql.Timestamp"
column="create_datetime" />
<property name="expireDate"
type="java.sql.Timestamp"
column="expire_datetime" />
<property name="emailAddress"
type="java.lang.String"
column="email_address" />
<property name="active"
type="boolean"
column="active_ind" />
<property name="userType"
type="java.lang.String"
column="user_type_code" />
<property name="lastLoginDate"
type="java.sql.Timestamp"
column="last_login_datetime" />
<property name="password"
type="java.lang.String"
column="password_text" />
<loader query-ref="user"/>
<sql-insert>INSERT INTO user (user_name, create_datetime, expire_datetime, email_address, active_ind, user_type_code, last_login_datetime, password_text) VALUES (?, ?, ?, ?, ?, ?, ?, aes_encrypt(?, "test_aes"))</sql-insert>
<sql-update>UPDATE user SET user_name=?, create_datetime=?, expire_datetime=?, email_address=?, active_ind=?, user_type_code=?, last_login_datetime=?, password_text=aes_encrypt(?, "test_aes") WHERE user_id=?</sql-update>
</class>
<sql-query name="user">
<return alias="user" class="com.kf.businessobject.impl.UserImpl" lock-mode="upgrade" />
SELECT user_id AS {user.id}, user_name AS {user.username}, create_datetime AS {user.createDate}, expire_datetime AS {user.expireDate}, email_address AS {user.emailAddress}, active_ind AS {user.active}, user_type_code AS {user.userType}, last_login_datetime AS {user.lastLoginDate}, aes_decrypt(password_text, "test_aes") AS {user.password}
FROM user
WHERE user_id = ?
FOR UPDATE
</sql-query>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():Code from our test case.
Code:
UserDAO userDAO = new UserDAOHibernateImpl();
User user = new UserImpl();
user.setUsername("testusername");
user.setPassword("welcome");
user.setActive(true);
user.setUserType(User.NORMAL);
user.setCreateDate(new Date());
userDAO.saveUser(user);
// Methods in the parent test class used to open
// and close hibernate sessions.
closeSession();
openSession();
User loadUser = new UserImpl();
userDAO.getUserById(user.getId());
loadUser = userDAO.getUserById(user.getId());
assertEquals(user.getPassword(), loadUser.getPassword());
The code for our DAO:
Code:
Object object = session.load( clazz, id );
Full stack trace of any exception that occurs:Just to be clear in MySQL if the hash used in aes_encrypt and aes_decrypt doesn't work right a
null is returned. Like the
null that is recieved below.
Code:
java.lang.AssertionError: expected:<welcome> but was:<null>
at org.junit.Assert.fail(Assert.java:58)
at org.junit.Assert.failNotEquals(Assert.java:259)
at org.junit.Assert.assertEquals(Assert.java:80)
at org.junit.Assert.assertEquals(Assert.java:88)
at com.kf.dao.impl.UserDAOHibernateImplTest.saveUser(UserDAOHibernateImplTest.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:32)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Name and version of the database you are using:mysql Ver 14.12 Distrib 5.0.22, for Win32 (ia32)
The generated SQL (show_sql=true):For the insert statement. I am hoping that the password_text would be aes_encrypt(?, "test_aes") instead of just a ?. This did work in 3.1 without any changes.
Code:
Hibernate:
insert
into
user
(user_name, create_datetime, expire_datetime, email_address, active_ind, user_type_code, last_login_datetime, password_text, domain_id)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?)
Here is the select statement for the user. This does have the aes_decrypt(password_text, "test_aes")code as I was hoping.
Code:
Hibernate:
SELECT
user_id AS user1_26_0_,
user_name AS user2_26_0_,
create_datetime AS create3_26_0_,
expire_datetime AS expire4_26_0_,
email_address AS email5_26_0_,
active_ind AS active6_26_0_,
user_type_code AS user7_26_0_,
last_login_datetime AS last8_26_0_,
aes_decrypt(password_text,
"test_aes") AS password9_26_0_,
domain_id AS domain10_26_0_
FROM
user
WHERE
user_id = ? FOR UPDATE
Debug level Hibernate log excerpt:Selected interesting logging...
Code:
...
2006-10-23 18:55:43,000 org.hibernate.persister.entity.AbstractEntityPersister DEBUG-> Insert 0: INSERT INTO user (user_name, create_datetime, expire_datetime, email_address, active_ind, user_type_code, last_login_datetime, password_text, domain_id) VALUES (?, ?, ?, ?, ?, ?, ?, aes_encrypt(?, "sn0wB@11"), ?)
2006-10-23 18:55:43,000 org.hibernate.persister.entity.AbstractEntityPersister DEBUG-> Update 0: UPDATE user SET user_name=?, create_datetime=?, expire_datetime=?, email_address=?, active_ind=?, user_type_code=?, last_login_datetime=?, password_text=aes_encrypt(?, "sn0wB@11"), domain_id=? WHERE user_id=?
2006-10-23 18:55:43,000 org.hibernate.persister.entity.AbstractEntityPersister DEBUG-> Delete 0: delete from user where user_id=?
2006-10-23 18:55:43,000 org.hibernate.persister.entity.AbstractEntityPersister DEBUG-> Identity insert: insert into user (user_name, create_datetime, expire_datetime, email_address, active_ind, user_type_code, last_login_datetime, password_text, domain_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
...
Problem:
We just upgraded from 3.1 to 3.2 and the Identity Insert seems to be used instead of the <sql-insert> we've tried to specify in our mapping file. I am hoping it is something simple that I am overlooking.
I'm sure I can do a work around by usings a named query for our saves, but I would prefer to use the <sql-insert> statement if possible.
To upgrade we took all the latest jars from the Hibernate 3.2 distribution and added them to our application. Here is the list of jars we currently have:
antlr-2.7.6.jar
asm.jar
asm-attrs.jar
c3p0-0.9.0.jar
cglib-2.1.3.jar
commons-beanutils.jar
commons-codec-1.3.jar
commons-collections-3.1.jar
commons-digester.jar
commons-discovery.jar
commons-el-1.0.jar
commons-lang-2.1.jar
commons-logging-1.0.4.jar
commons-validator.jar
dom4j-1.6.1.jar
ehcache-1.2.jar
hibernate3.jar
jdbc2_0-stdext.jar
jdom.jar
jta.jar
junit-4.0.jar
log4j-1.2.11.jar
mysql-connector-java-3.0.17-ga-bin.jar
xerces-2.6.2.jar
Any assistance is greatly appreciated. Also, if this issue is covered in the documentation somewhere a friendly/gental push in the right direction (like a URL or two) would be fantastic.