Hi,
I am running into a much discussed error with a one-to-one mapping, but I just can't getting fixed! I keep running into the following error:
Exception in thread "main" org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [nl.marktmonitor.skillskompas.skillskompas.model.UserSession.user]I am trying to tie a UserSession to an AbstractUser in a one-to-one relationship using a foreign key association.
This is the mapping for the AbstractUser:
Code:
<hibernate-mapping package="nl.marktmonitor.skillskompas.skillskompas.model">
<class name="AbstractUser" table="SM_USER">
<id name="userId" type="integer" column="USER_ID">
<generator class="native" />
</id>
<one-to-one name="userSession" class="UserSession" cascade="all"/>
<property name="username" type="string" column="USERNAME"
unique="true" />
<property name="password" type="string" column="PASSWORD" />
</class>
</hibernate-mapping>
This is the mapping for the UserSession:
Code:
<hibernate-mapping package="nl.marktmonitor.skillskompas.skillskompas.model">
<class name="UserSession" table="SM_USERSESSION">
<id name="sessionId" column="SESSION_ID">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<one-to-one name="user" class="AbstractUser" constrained="true" />
<property name="UUID" type="string" not-null="true" length="40" column="UUID" />
<property name="loginDate" type="date" not-null="true" column="LOGIN_DATE" />
</class>
</hibernate-mapping>
And this is the code I use:
Code:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
AbstractUser user = null;
List userList = session.createQuery("from AbstractUser au where au.username = :username")
.setString("username", "myUserName")
.list();
if (userList.size() > 0)
user = (AbstractUser) userList.get(0);
// Compare (encrypted) passwords
if(user != null && user.getPassword().equals("myPassWord")){
// Authentication succeeded!
// Create a new UserSession for this user
UserSession ses = new UserSession();
// Generate the session id
String uuid = UUID.randomUUID().toString();
ses.setUUID(uuid);
ses.setLoginDate(new Date());
// Set the UserSession on the user
user.setUserSession(ses);
// Save/Update
session.update(user);
}
// Commit
session.getTransaction().commit();
This throws the "attempted to assign id from null one-to-one property" error. Do you know why and how to solve this? The problem occurs on the session.update(user). All the surrounding code works fine.
Also, when I use session.save() instead of session.update, Hibernate tries to insert a new AbstractUser record with the same id, resulting in a PK constraint failure. Why is Hibernate tryuing to insert a new record instead of just updating the existing one?