From: <phr...@im...> - 2002-12-16 20:14:05
|
hi, excuse my arrogance for re-posting this, but i haven't found a solution for the problem described below: On Tue, 10 Dec 2002 12:34:56 -0500, phr...@im... said: > hi, > > On Tue, 10 Dec 2002 10:34:30 +1100, "Gavin King" <Gav...@ex...> > said: > > Oh, so it isn't actually a composite key. I didn't understand > > properly then. Well, using a UserType is exactly the right > > approach. You would also need to implement IdentifierGenerator > > to generate instances of PrimaryKey (your implementation could > > just wrap up a built-in key generation strategy). This should > > work out perfectly - if you have any more problems let me know. > > > > The mapping would be: > > > > <id name="key" type="my.pkg.PrimaryKeyType"> > > <generator class="my.pkg.PrimaryKeyGenerator"/> > > </id> > > i created my own PK generator, but i'm still getting the same exception i > had before: > > cirrus.hibernate.PropertyAccessException: IllegalArgumentException > occurred while calling setter of test.hibernate.Foo.pk > at cirrus.hibernate.helpers.ReflectHelper.set(ReflectHelper.java:190) > at > cirrus.hibernate.persister.AbstractEntityPersister.setIdentifier(AbstractEntityPersister.java:281) > at cirrus.hibernate.impl.SessionImpl.doSave(SessionImpl.java:528) > at cirrus.hibernate.impl.SessionImpl.save(SessionImpl.java:483) > at cirrus.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:919) > at > test.hibernate.ejb.HibTestSessionBean.saveFoo(HibTestSessionBean.java:53) > > from Foo.hbm.xml: > > <id type="test.hibernate.MyPrimaryKeyType" name="pk" column="id" > length="16" unsaved-value="null"> > <generator class="test.hibernate.MySequencePKGenerator"> > <param>MY_SEQ</param> > </generator> > </id> > > Foo.java has: > > public PrimaryKey getPk() > public void setPk(PrimaryKey pk) > (i tried adding setPk(Long), setPk(String), setPK(long) - that didnt > chg the exception at all) > > > My pk generator extends SequenceGenerator, and overrides one method as > follows: > > public Serializable generate(SessionImplementor session, Object obj) > throws SQLException, HibernateException { > return new PrimaryKey( String.valueOf(super.generate(session, obj)) ); > } > > > the implementation of my UserType is as follows: > > private static final int[] TYPES = { Types.VARCHAR }; > > public int[] sqlTypes() { > return TYPES; > } > > public Class returnedClass() { > return PrimaryKey.class; > } > > public boolean equals(Object x, Object y) { > if (x==y) return true; > if (x==null || y==null) return false; > return x.equals(y); > } > > public Object nullSafeGet(ResultSet rs, String[] names, Object owner) > throws HibernateException, SQLException { > String id = (String) Hibernate.STRING.nullSafeGet(rs, names[0]); > return id==null ? null : new PrimaryKey(id); > } > > public void nullSafeSet(PreparedStatement st, Object value, int index) > throws HibernateException, SQLException { > String id = (value==null) ? null : ((PrimaryKey)value).getId(); > Hibernate.STRING.nullSafeSet(st, id, index); > } > > public Object deepCopy(Object o) { > if (o==null) return null; > return new PrimaryKey( (PrimaryKey)o ); > } > > public boolean isMutable() { > return false; > } > > > any help would be appreciated :) > > viktor > -- > > phr...@im... > > -- > http://fastmail.fm - Does exactly what it says on the tin -- phr...@im... -- http://fastmail.fm - Does exactly what it says on the tin |