Hello. I'm having problems when converting my application from castor to hibernate.
I have traced the error to java.reflect.Method.invoke in net.sf.hibernate.property.BasicPropertyAccessor$BasicGetter
The JDK API docs tells me something about the original error but I can't understant a bit :(
The Method class API document page is here:
[url]http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html#invoke(java.lang.Object,%20java.lang.Object[])[/url]
Hibernate version: Hibernate 2.1.1
Database is PostgreSQL 7.2.1
The mapping file (not all of it, I removed some of non relevant parts)
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
auto-import="true"
default-cascade="save-update"
package="org.assembly.elaine.types">
<class
name="org.assembly.elaine.types.Stream"
table="stream"
dynamic-update="true"
select-before-update="true"
optimistic-lock="version">
<id
name="id"
column="id"
type="integer">
<generator class="sequence">
<param name="sequence">program_type_id_seq</param>
</generator>
</id>
<version
name="stamp"
column="stamp"
type="timestamp"/>
<many-to-one
name="title"
column="title"
cascade="all"
class="org.assembly.elaine.types.Language"/>
<property
name="begins"
type="timestamp"
column="begins" />
<property
name="ends"
type="timestamp"
column="ends" />
<many-to-one
name="state"
column="state"
cascade="none"
class="org.assembly.elaine.types.StreamState"/>
<property
name="uniqueId"
column="unique_id"
type="string"/>
</class>
<class
name="org.assembly.elaine.types.Language"
table="language"
dynamic-update="true"
select-before-update="true"
optimistic-lock="version">
<id
name="id"
column="id"
type="integer">
<generator class="sequence">
<param name="sequence">language_id_seq</param>
</generator>
</id>
<version
name="stamp"
column="stamp"
type="timestamp"/>
<property
name="name"
column="name"
type="string"/>
<property
name="abbreviation"
column="abbreviation"
type="string"/>
</class>
<class
name="org.assembly.elaine.types.MessageData"
table="message_data"
dynamic-update="true"
select-before-update="true"
optimistic-lock="version">
<id
name="id"
column="id"
type="integer">
<generator class="sequence">
<param name="sequence">message_data_id_seq</param>
</generator>
</id>
<version
name="stamp"
column="stamp"
type="timestamp"/>
<property
name="content"
column="content"
type="string"/>
<many-to-one
name="language"
column="language"
cascade="none"
class="org.assembly.elaine.types.Language" />
<property
name="uniqueId"
column="unique_id"
type="string"/>
<many-to-one
name="message"
column="message"
class="org.assembly.elaine.types.Message"
not-null="true"/>
</class>
</hibernate-mapping>
The Language class:
Code:
public class Language
implements Serializable {
private Integer id;
private String name;
private String abbreviation;
private Date stamp;
public Language() {
Language.setDefaultValues(this);
}
public Language(org.assembly.elaine.binding.Language o) {
Language.setDefaultValues(this);
try {
PropertyUtils.copyProperties(this, o);
} catch(Exception e) { }
}
/** full constructor */
public Language(String name, String abbreviation, Date stamp) {
this.id = null;
this.name = name;
this.abbreviation = abbreviation;
this.stamp = stamp;
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
... get/set methods for name, abbreviation and stamp
public String toString() {
return new ToStringBuilder(this)
.append("id", getId())
.append("abbreviation", getAbbreviation())
.toString();
}
public boolean equals(Object other) {
if ( !(other instanceof Language) ) return false;
Language castOther = (Language) other;
return new EqualsBuilder()
.append(this.getId(), castOther.getId())
.isEquals();
}
public int hashCode() {
return new HashCodeBuilder()
.append(getId())
.toHashCode();
}
public static Language getInstance() {
Language r = new Language();
return r;
}
public static Language getInstance(org.assembly.elaine.binding.Language o) {
Language r = new Language(o);
return r;
}
public static void setDefaultValues(Language o) {
o.id = null;
o.setStamp(new Date());
}
Main java code:
Code:
s = factory.openSession();
try {
// THIS WORKS. The language instance was fetched
// in previous session
tx = s.beginTransaction();
Message m = new Message();
// m.setUniqueId("X");
MessageData md = new MessageData();
md.setContent("FOOFOO");
md.setLanguage(l);
md.setMessage(m);
m.addMessageData(md);
s.saveOrUpdate(m);
tx.commit();
// This transaction fails due to the error
tx = s.beginTransaction();
l = (Language)s.get(Language.class, new Integer(1));
Stream stream = new Stream();
query = s.createQuery("FROM StreamState WHERE name = ?");
query.setString(0, "testing");
List res = query.list();
StreamState ss = (StreamState) res.get(0);
md = MessageData.getInstance(l, "Sreaaami");
Message streamTitle = Message.getInstance();
streamTitle.addMessageData(md);
stream.setTitle(md);
stream.setState(ss);
s.saveOrUpdate(stream);
tx.commit();
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
throw e;
} finally {
s.close();
}
Copy of log:
Code:
[java] 2004-02-19 15:19:56,489 DEBUG Cascades.java:524: cascading to collection: org.assembly.elaine.types.Message.messageData
[java] 2004-02-19 15:19:56,491 DEBUG Cascades.java:113: cascading to saveOrUpdate()
[java] 2004-02-19 15:19:56,494 DEBUG SessionImpl.java:1306: saveOrUpdate() persistent instance
[java] 2004-02-19 15:19:56,497 DEBUG Cascades.java:506: done processing cascades for: org.assembly.elaine.types.Message
[java] 2004-02-19 15:19:56,499 DEBUG Cascades.java:497: processing cascades for: org.assembly.elaine.types.MessageData
[java] 2004-02-19 15:19:56,512 DEBUG Cascades.java:113: cascading to saveOrUpdate()
[java] 2004-02-19 15:19:56,515 DEBUG SessionImpl.java:1306: saveOrUpdate() persistent instance
[java] 2004-02-19 15:19:56,517 DEBUG Cascades.java:506: done processing cascades for: org.assembly.elaine.types.MessageData
[java] 2004-02-19 15:19:56,745 DEBUG Cascades.java:497: processing cascades for: org.assembly.elaine.types.Language
[java] 2004-02-19 15:19:56,759 DEBUG Cascades.java:506: done processing cascades for: org.assembly.elaine.types.Language
[java] 2004-02-19 15:19:56,761 DEBUG Cascades.java:497: processing cascades for: org.assembly.elaine.types.StreamState
[java] Exception in thread "main" net.sf.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of org.assembly.elaine.types.Language.id
[java] at net.sf.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:110)
[java] 2004-02-19 15:19:56,765 DEBUG Cascades.java:506: done processing cascades for: org.assembly.elaine.types.StreamState
[java] at net.sf.hibernate.persister.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:310)
[java] 2004-02-19 15:19:56,767 DEBUG Cascades.java:497: processing cascades for: org.assembly.elaine.types.Message
[java] at net.sf.hibernate.proxy.HibernateProxyHelper.getIdentifier(HibernateProxyHelper.java:50)
[java] at net.sf.hibernate.type.EntityType.toString(EntityType.java:84)
[java] 2004-02-19 15:19:56,769 DEBUG Cascades.java:524: cascading to collection: org.assembly.elaine.types.Message.messageData
[java] 2004-02-19 15:19:56,772 DEBUG Cascades.java:113: cascading to saveOrUpdate()
[java] at net.sf.hibernate.impl.Printer.toString(Printer.java:49)
[java] at net.sf.hibernate.impl.Printer.toString(Printer.java:82)
[java] 2004-02-19 15:19:56,774 DEBUG SessionImpl.java:1306: saveOrUpdate() persistent instance
[java] at net.sf.hibernate.impl.SessionImpl.flushEverything(SessionImpl.java:2228)
[java] at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2186)
[java] 2004-02-19 15:19:56,776 DEBUG Cascades.java:506: done processing cascades for: org.assembly.elaine.types.Message
[java] at net.sf.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:61)
[java] 2004-02-19 15:19:56,779 DEBUG Cascades.java:497: processing cascades for: org.assembly.elaine.types.MessageData
[java] 2004-02-19 15:19:56,788 DEBUG Cascades.java:113: cascading to saveOrUpdate()
[java] at org.assembly.elaine.test.HibernateTest.main(HibernateTest.java:129)
[java] Caused by: java.lang.IllegalArgumentException: java.lang.ClassCastException@1bde4
[java] 2004-02-19 15:19:56,791 DEBUG SessionImpl.java:1306: saveOrUpdate() persistent instance
[java] at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[java] 2004-02-19 15:19:56,793 DEBUG Cascades.java:506: done processing cascades for: org.assembly.elaine.types.MessageData
[java] at java.lang.reflect.Method.invoke(Method.java:324)
[java] 2004-02-19 15:19:56,795 DEBUG Cascades.java:497: processing cascades for: org.assembly.elaine.types.Stream
[java] 2004-02-19 15:19:56,797 DEBUG Cascades.java:113: cascading to saveOrUpdate()
[java] at net.sf.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:96)
[java] ... 9 more
[java] 2004-02-19 15:19:56,800 DEBUG SessionImpl.java:1306: saveOrUpdate() persistent instance
[java] 2004-02-19 15:19:56,802 DEBUG Cascades.java:506: done processing cascades for: org.assembly.elaine.types.Stream
[java] 2004-02-19 15:19:56,806 DEBUG SessionImpl.java:2321: Flushing entities and processing referenced collections
[java] 2004-02-19 15:19:56,809 DEBUG SessionImpl.java:2768: Collection found: [org.assembly.elaine.types.Message.messageData#68], was: [org.assembly.elaine.types.Message.messageData#68]
[java] 2004-02-19 15:19:57,085 DEBUG WrapVisitor.java:76: Wrapped collection in role: org.assembly.elaine.types.Message.messageData
[java] 2004-02-19 15:19:57,092 DEBUG AbstractEntityPersister.java:278: org.assembly.elaine.types.Message.messageData is dirty
Please help. I have also tried to convert the get/set methods to use bare
int and not
Integer but it didn't help.
Changing getId -method to return (Integer) null makes hibernate throw error that the Id value has been altered.
- jtm