-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Envers retrieve revisions produces PropertyNotFoundException
PostPosted: Wed May 19, 2010 10:12 am 
Newbie

Joined: Wed May 19, 2010 9:37 am
Posts: 1
Hi all,

On retrieve all revisions of a entity with a composite-id
the function AuditReaderImpl.find produces the following error:
=====================================================================
11:51:34,825 ERROR http-8080-2 HibernateVersionDAOUtil:52 - ::getVersions: error loading: ContentData
org.hibernate.envers.exception.AuditException: org.hibernate.PropertyNotFoundException: Could not find a setter for property contentid in class java.lang.Object
at org.hibernate.envers.entities.mapper.id.EmbeddedIdMapper.mapToEntityFromMap(EmbeddedIdMapper.java:82)
at org.hibernate.envers.entities.EntityInstantiator.createInstanceFromVersionsEntity(EntityInstantiator.java:95)
at org.hibernate.envers.entities.EntityInstantiator.addInstancesFromVersionsEntities(EntityInstantiator.java:103)
at org.hibernate.envers.query.impl.EntitiesAtRevisionQuery.list(EntitiesAtRevisionQuery.java:90)
at org.hibernate.envers.query.impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:105)
at org.hibernate.envers.reader.AuditReaderImpl.find(AuditReaderImpl.java:106)
..
..
..
at java.lang.Thread.run(Thread.java:619)
Caused by: org.hibernate.PropertyNotFoundException: Could not find a setter for property contentid in class java.lang.Object
at org.hibernate.property.BasicPropertyAccessor.createSetter(BasicPropertyAccessor.java:262)
at org.hibernate.property.BasicPropertyAccessor.getSetter(BasicPropertyAccessor.java:255)
at org.hibernate.envers.tools.reflection.ReflectionTools.getSetter(ReflectionTools.java:85)
at org.hibernate.envers.tools.reflection.ReflectionTools.getSetter(ReflectionTools.java:78)
at org.hibernate.envers.entities.mapper.id.SingleIdMapper.mapToEntityFromMap(SingleIdMapper.java:64)
at org.hibernate.envers.entities.mapper.id.EmbeddedIdMapper.mapToEntityFromMap(EmbeddedIdMapper.java:79)
... 29 more
=====================================================================

The reportetd error is correct, becouse in the class ContentData no setter for a field "contentid " exists.

Insted of set the fields directly in the entry, a primary key class ContentDataPK should be instanciated and in that the
primary key fields should be set.

below you see the access function, entity class "ContentData", primary key class "ContentDataPK" and the hibernate configuration.


Question: is it not possible to retrieve the revisions for a entity with a composite-id ?


Please suggest how can i proceed.

Thanks in advance.

Hannes


=== retireve revisions ======================================================
public class HibernateVersionDAOUtil {

public Map<Number, ?> getVersions(Session session, Class<?> cls, Serializable id) throws PersistentException {

log.debug("::getVersions: cls:" + cls + " id:" + id + " session:" + session);
Map map = new HashMap();
Transaction tx = null;

boolean opened = false;
try {
tx = session.getTransaction();
if (tx==null || tx.isActive()==false) {
log.debug("starting new transaction...");
tx = session.beginTransaction();
opened = true;
}

AuditReader reader = AuditReaderFactory.get(session);
List<Number> versions = reader.getRevisions(cls, id);

for (Number c : versions ) {
Object obj = reader.find(cls, id, c);

map.put(c, obj);
}

if (opened) {
log.debug("::getVersions: autocomitting new transaction...");
tx.commit();
}
} catch (HibernateException e) {
log.error("::getVersions: error loading: "+cls.getName(),e);
if (tx != null && tx.isActive()) {
try {
tx.rollback();
} catch (HibernateException e1) {
log.error("::getVersions: error rolling back after exception at find "+cls.getSimpleName(),e1);
}
}

throw new PersistentException("persistence", "getVersions", "hibernate error:" + e.getLocalizedMessage(), null, e);
}

log.debug("::getVersions: result:" + map);

return map;
}
}
=====================================================================

==== primary key class ====================================================
public class ContentDataPK {
private Integer contentid;
private String language;

public ContentDataPK() {
super();
}

public ContentDataPK(Integer contentid, String language) {
this.contentid = contentid;
this.language = language;
}

public String getLanguage() {
return language;
}

public void setLanguage(String language) {
this.language = language;
}

public Integer getContentid() {
return contentid;
}

public void setContentid(Integer contentid) {
this.contentid = contentid;
}
}
=====================================================================

==== entity class =================================================================
@Audited
public class ContentData implements Serializable {

private ContentDataPK id; // primary key

private String title;
private String text;

public ContentData() {
super();
}

public ContentData(Integer id, String language, String title, String text) {
this.id = new ContentDataPK(id, language);

this.title = title;
this.text = text;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getText() {
return text;
}

public void setText(String text) {
this.text = text;
}

public ContentDataPK getId() {
return id;
}

public void setId(ContentDataPK id) {
this.id = id;
}

}
=====================================================================


=== hibernate mapping ================================================
<?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" >
<hibernate-mapping>
<class name="ContentData" table="contents">

<composite-id name="id" class="ContentDataPK">
<key-property name="contentid" column="contentid" type="java.lang.Integer" />
<key-property name="language" column="language" type="java.lang.String"/>
</composite-id>
<property name="title" column="title" type="java.lang.String" />
<property name="text" column="text" type="java.lang.String" />

</class>
</hibernate-mapping>
=====================================================================


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.