Hi, all!
I have the problem:
--------------------------------------------------------------------------------------------------------------------------------------
hibernate.log:
--------------------------------------------------------------------------------------------------------------------------------------
Code:
474 - Checking 0 named HQL queries
21:28:56,796 DEBUG SessionFactoryImpl:494 - Checking 0 named SQL queries
21:28:56,812 DEBUG SessionImpl:248 - opened session at timestamp: 12754169367
21:28:56,812 DEBUG JDBCTransaction:82 - begin
21:28:56,828 DEBUG ConnectionManager:444 - opening JDBC connection
21:28:56,828 DEBUG JDBCTransaction:87 - current autocommit status: false
21:28:56,828 DEBUG UserDAO:204 - saving User instance
21:28:56,828 DEBUG IncrementGenerator:104 - fetching initial value: select max(user_id) from user
21:28:56,828 DEBUG AbstractBatcher:410 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
21:28:56,828 DEBUG SQL:111 - select max(user_id) from user
21:28:56,843 DEBUG IncrementGenerator:119 - first free id: 1
21:28:56,843 DEBUG AbstractBatcher:418 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
21:28:56,843 DEBUG AbstractSaveEventListener:135 - generated identifier: 1, using strategy: org.hibernate.id.IncrementGenerator
21:28:56,859 ERROR UserDAO:212 - save failed
org.hibernate.PropertyValueException: not-null property references a null or transient value: com.shop.hibernate.User.userGroup
at org.hibernate.engine.Nullability.checkNullability(Nullability.java:95)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:313)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:144)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:563)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:551)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:547)
at com.shop.hibernate.UserDAO.save(UserDAO.java:207)
at com.tests.UserDaoTests.testSave(UserDaoTests.java:169)
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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
--------------------------------------------------------------------------------------------------------------------------------------
My settings:
--------------------------------------------------------------------------------------------------------------------------------------
hibernate.cfg.xml:
--------------------------------------------------------------------------------------------------------------------------------------
Code:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/shopdb
</property>
<property name="connection.username">***</property>
<property name="connection.password">***</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="myeclipse.connection.profile">
MySql Shop Connection
</property>
<property name="hbm2ddl.auto">create-drop</property>
<property name="show_sql">true</property>
<mapping resource="com/shop/hibernate/User.hbm.xml" />
<mapping resource="com/shop/hibernate/UserGroup.hbm.xml" />
</session-factory>
</hibernate-configuration>
--------------------------------------------------------------------------------------------------------------------------------------
User.hbm.xml:
--------------------------------------------------------------------------------------------------------------------------------------
Code:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file
-->
<hibernate-mapping>
<class name="com.shop.hibernate.User" table="user" catalog="shopdb">
<id name="userId" type="java.lang.Integer">
<column name="user_id" />
<generator class="increment" />
</id>
<many-to-one name="userGroup" class="com.shop.hibernate.UserGroup" fetch="select">
<column name="user_group_id" not-null="true" />
</many-to-one>
<property name="username" type="java.lang.String">
<column name="username" length="20" not-null="true" />
</property>
<property name="password" type="java.lang.String">
<column name="password" length="32" not-null="true" />
</property>
<property name="firstname" type="java.lang.String">
<column name="firstname" length="32" not-null="true" />
</property>
<property name="lastname" type="java.lang.String">
<column name="lastname" length="32" not-null="true" />
</property>
<property name="email" type="java.lang.String">
<column name="email" length="96" not-null="true" />
</property>
<property name="status" type="java.lang.Integer">
<column name="status" not-null="true" />
</property>
<property name="ip" type="java.lang.String">
<column name="ip" length="15" not-null="true" />
</property>
<property name="dateAdded" type="java.sql.Timestamp">
<column name="date_added" length="19" not-null="true" />
</property>
</class>
</hibernate-mapping>
--------------------------------------------------------------------------------------------------------------------------------------
AbstractUser.java:
--------------------------------------------------------------------------------------------------------------------------------------
Code:
package com.shop.hibernate;
import java.sql.Timestamp;
/**
* AbstractUser entity provides the base persistence definition of the User
* entity. @author vav
*/
public abstract class AbstractUser implements java.io.Serializable
{
// Fields
private Integer userId;
private UserGroup userGroup;
private String username;
private String password;
private String firstname;
private String lastname;
private String email;
private Integer status;
private String ip;
private Timestamp dateAdded;
/** default constructor */
public AbstractUser()
{
}
/** full constructor */
public AbstractUser(UserGroup userGroup, String username, String password,
String firstname, String lastname, String email, Integer status,
String ip, Timestamp dateAdded)
{
this.userGroup = userGroup;
this.username = username;
this.password = password;
this.firstname = firstname;
this.lastname = lastname;
this.email = email;
this.status = status;
this.ip = ip;
this.dateAdded = dateAdded;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj == null)
{
return false;
}
if (!(obj instanceof AbstractUser))
{
return false;
}
AbstractUser other = (AbstractUser) obj;
if (dateAdded == null)
{
if (other.dateAdded != null)
{
return false;
}
}
else if (!dateAdded.equals(other.dateAdded))
{
return false;
}
if (email == null)
{
if (other.email != null)
{
return false;
}
}
else if (!email.equals(other.email))
{
return false;
}
if (firstname == null)
{
if (other.firstname != null)
{
return false;
}
}
else if (!firstname.equals(other.firstname))
{
return false;
}
if (ip == null)
{
if (other.ip != null)
{
return false;
}
}
else if (!ip.equals(other.ip))
{
return false;
}
if (lastname == null)
{
if (other.lastname != null)
{
return false;
}
}
else if (!lastname.equals(other.lastname))
{
return false;
}
if (password == null)
{
if (other.password != null)
{
return false;
}
}
else if (!password.equals(other.password))
{
return false;
}
if (status == null)
{
if (other.status != null)
{
return false;
}
}
else if (!status.equals(other.status))
{
return false;
}
if (userGroup == null)
{
if (other.userGroup != null)
{
return false;
}
}
else if (!userGroup.equals(other.userGroup))
{
return false;
}
if (userId == null)
{
if (other.userId != null)
{
return false;
}
}
else if (!userId.equals(other.userId))
{
return false;
}
if (username == null)
{
if (other.username != null)
{
return false;
}
}
else if (!username.equals(other.username))
{
return false;
}
return true;
}
// Constructors
public Timestamp getDateAdded()
{
return this.dateAdded;
}
public String getEmail()
{
return this.email;
}
// Property accessors
public String getFirstname()
{
return this.firstname;
}
public String getIp()
{
return this.ip;
}
public String getLastname()
{
return this.lastname;
}
public String getPassword()
{
return this.password;
}
public Integer getStatus()
{
return this.status;
}
public UserGroup getUserGroup()
{
return this.userGroup;
}
public Integer getUserId()
{
return this.userId;
}
public String getUsername()
{
return this.username;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result
+ ((dateAdded == null) ? 0 : dateAdded.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result
+ ((firstname == null) ? 0 : firstname.hashCode());
result = prime * result + ((ip == null) ? 0 : ip.hashCode());
result = prime * result
+ ((lastname == null) ? 0 : lastname.hashCode());
result = prime * result
+ ((password == null) ? 0 : password.hashCode());
result = prime * result + ((status == null) ? 0 : status.hashCode());
result = prime * result
+ ((userGroup == null) ? 0 : userGroup.hashCode());
result = prime * result + ((userId == null) ? 0 : userId.hashCode());
result = prime * result
+ ((username == null) ? 0 : username.hashCode());
return result;
}
public void setDateAdded(Timestamp dateAdded)
{
this.dateAdded = dateAdded;
}
public void setEmail(String email)
{
this.email = email;
}
public void setFirstname(String firstname)
{
this.firstname = firstname;
}
public void setIp(String ip)
{
this.ip = ip;
}
public void setLastname(String lastname)
{
this.lastname = lastname;
}
public void setPassword(String password)
{
this.password = password;
}
public void setStatus(Integer status)
{
this.status = status;
}
public void setUserGroup(UserGroup userGroup)
{
this.userGroup = userGroup;
}
public void setUserId(Integer userId)
{
this.userId = userId;
}
public void setUsername(String username)
{
this.username = username;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
return "AbstractUser [username=" + username + "]";
}
}
--------------------------------------------------------------------------------------------------------------------------------------
User.java:
--------------------------------------------------------------------------------------------------------------------------------------
Code:
package com.shop.hibernate;
import java.sql.Timestamp;
/**
* User entity. @author vav
*/
public class User extends AbstractUser implements java.io.Serializable
{
// Constructors
/** default constructor */
public User()
{
}
/** full constructor */
public User(UserGroup userGroup, String username, String password,
String firstname, String lastname, String email, Integer status,
String ip, Timestamp dateAdded)
{
super(userGroup, username, password, firstname, lastname, email,
status, ip, dateAdded);
}
}
--------------------------------------------------------------------------------------------------------------------------------------
UserGroup.hbm.xml:
--------------------------------------------------------------------------------------------------------------------------------------
Code:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file
-->
<hibernate-mapping>
<class name="com.shop.hibernate.UserGroup" table="user_group" catalog="shopdb">
<id name="userGroupId" type="java.lang.Integer">
<column name="user_group_id" />
<generator class="increment" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="64" not-null="true" />
</property>
<property name="permission" type="java.lang.String">
<column name="permission" length="65535" not-null="true" />
</property>
<set name="users" inverse="true">
<key>
<column name="user_group_id" not-null="true" />
</key>
<one-to-many class="com.shop.hibernate.User" />
</set>
</class>
</hibernate-mapping>
--------------------------------------------------------------------------------------------------------------------------------------
AbstractUserGroup.java:
--------------------------------------------------------------------------------------------------------------------------------------
Code:
package com.shop.hibernate;
import java.util.HashSet;
import java.util.Set;
/**
* AbstractUserGroup entity provides the base persistence definition of the
* UserGroup entity. @author vav
*/
public abstract class AbstractUserGroup implements java.io.Serializable
{
// Fields
private Integer userGroupId;
private String name;
private String permission;
private Set<User> users = new HashSet<User>(0);
/** default constructor */
public AbstractUserGroup()
{
}
/** minimal constructor */
public AbstractUserGroup(String name, String permission)
{
this.name = name;
this.permission = permission;
}
/** full constructor */
public AbstractUserGroup(String name, String permission, Set<User> users)
{
this.name = name;
this.permission = permission;
this.users = users;
}
// Constructors
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj == null)
{
return false;
}
if (!(obj instanceof AbstractUserGroup))
{
return false;
}
AbstractUserGroup other = (AbstractUserGroup) obj;
if (name == null)
{
if (other.name != null)
{
return false;
}
}
else if (!name.equals(other.name))
{
return false;
}
if (permission == null)
{
if (other.permission != null)
{
return false;
}
}
else if (!permission.equals(other.permission))
{
return false;
}
if (userGroupId == null)
{
if (other.userGroupId != null)
{
return false;
}
}
else if (!userGroupId.equals(other.userGroupId))
{
return false;
}
if (users == null)
{
if (other.users != null)
{
return false;
}
}
else if (!users.equals(other.users))
{
return false;
}
return true;
}
public String getName()
{
return this.name;
}
public String getPermission()
{
return this.permission;
}
// Property accessors
public Integer getUserGroupId()
{
return this.userGroupId;
}
public Set<User> getUsers()
{
return this.users;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result
+ ((permission == null) ? 0 : permission.hashCode());
result = prime * result
+ ((userGroupId == null) ? 0 : userGroupId.hashCode());
result = prime * result + ((users == null) ? 0 : users.hashCode());
return result;
}
public void setName(String name)
{
this.name = name;
}
public void setPermission(String permission)
{
this.permission = permission;
}
public void setUserGroupId(Integer userGroupId)
{
this.userGroupId = userGroupId;
}
public void setUsers(Set<User> users)
{
this.users = users;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
return "AbstractUserGroup [name=" + name + "]";
}
}
--------------------------------------------------------------------------------------------------------------------------------------
UserGroup.java:
--------------------------------------------------------------------------------------------------------------------------------------
Code:
package com.shop.hibernate;
import java.util.Set;
/**
* UserGroup entity. @author vav
*/
public class UserGroup extends AbstractUserGroup implements
java.io.Serializable
{
// Constructors
/** default constructor */
public UserGroup()
{
}
/** minimal constructor */
public UserGroup(String name, String permission)
{
super(name, permission);
}
/** full constructor */
public UserGroup(String name, String permission, Set<User> users)
{
super(name, permission, users);
}
}
--------------------------------------------------------------------------------------------------------------------------------------
Test programm:
--------------------------------------------------------------------------------------------------------------------------------------
Code:
/**
* Test method for
* {@link com.shop.hibernate.UserDAO#save(com.shop.hibernate.User)}.
*/
@Test
public final void testSave()
{
// 0. Create user group
UserGroup userGroup = new UserGroup();
userGroup.setName("managers");
userGroup.setPermission("restricted");
// 1. Create user
User user = new User();
user.setDateAdded(new Timestamp(new Date().getDate()));
user.setEmail("test@test.tst");
user.setFirstname("Test");
user.setIp("localhost");
user.setLastname("Test");
user.setPassword("test");
user.setStatus(new Integer(11));
user.setUserGroup(userGroup);
user.setUsername("test");
// 2. Create DAO
UserDAO dao = new UserDAO();
// 3. Start the transaction
Transaction tx = dao.getSession().beginTransaction();
// 4. Add user
dao.save(user);
// 5. Commit the transaction (write to database)
tx.commit();
// 6. Close the session (cleanup connections)
dao.getSession().close();
}
--------------------------------------------------------------------------------------------------------------------------------------
Thanks for your help!