Basic idea is to have Categories within Categories within Categories. Sub Categories can have only one parent Category. A parent Category can have multiple sub categories. The relationship needs to be bi directional. Below is the Category.hbm.xml and Category.java files. I am getting an exception when I am trying to create and insert a category like this:
Code:
Session session = getSession();
Transaction tx = session.beginTransaction();
session.save(cat);
session.flush();
tx.commit();
Hibernate version: 3.0
Mapping documents:Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="com.am.t.beans.Category" table="category">
<id name="id" unsaved-value="0">
<generator class="native"/>
</id>
<property name="name" type="string"/>
<property name="description" type="string"/>
<many-to-one name="parentId" class="com.am.t.beans.Category"
column="parentId"
not-null="true"/>
<set name="subCategories" cascade="all" lazy="true" inverse="true">
<key column="parentId"/>
<one-to-many class="com.am.t.beans.Category"/>
</set>
</class>
</hibernate-mapping>
Name and version of the database you are using:MySQL 4.1.3
Debug level Hibernate log excerpt:Code:
DEBUG - closing JDBC connection (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)
org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.am.t.beans.Category.id
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:119)
at org.hibernate.tuple.AbstractTuplizer.getIdentifier(AbstractTuplizer.java:103)
at org.hibernate.persister.entity.BasicEntityPersister.getIdentifier(BasicEntityPersister.java:2904)
at org.hibernate.persister.entity.BasicEntityPersister.isTransient(BasicEntityPersister.java:2681)
at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:175)
at org.hibernate.engine.ForeignKeys$Nullifier.isNullifiable(ForeignKeys.java:137)
at org.hibernate.engine.ForeignKeys$Nullifier.nullifyTransientReferences(ForeignKeys.java:69)
at org.hibernate.engine.ForeignKeys$Nullifier.nullifyTransientReferences(ForeignKeys.java:47)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:232)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:158)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:104)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:429)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:424)
at com.am.t.dao.DSCategoryDAO.insertCategory(DSCategoryDAO.java:82)
at com.am.t.beans.TestCategrory.testInsertGroup(TestCategrory.java:36)
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 junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:421)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:305)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:186)
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
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.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:105)
... 34 more
Category.java:Code:
public class Category
{
private Long id;
private Long parentId;
private String name;
private String description;
private Set subCategories;
public Category()
{
}
public Category(Long parentId, String name, String description)
{
this.parentId = parentId;
this.name = name;
this.description = description;
}
public Long getId()
{
return id;
}
private void setId(Long id)
{
this.id = id;
}
public String getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description = description;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Long getParentId()
{
return parentId;
}
public void setParentId(Long parentId)
{
this.parentId = parentId;
}
public Set getSubCategories()
{
return subCategories;
}
public void setSubCategories(Set subCategories)
{
this.subCategories = subCategories;
}
}
Does anyone have an idea whats going wrong? [Note: I have tried to find a solution to the problem by searching this forum and reading the documentation, but maybe I am missing something basic.]
Thanks.