]
Lukasz Antoniak resolved HHH-7073.
----------------------------------
Resolution: Fixed
Fix Version/s: 4.1.1
Assignee: Lukasz Antoniak
Thank you for the clear test case. Not null check that was mentioned previously seems to
resolve this issue. I have developed more complex test and committed it with actual fix to
the master branch. If you'd like, you can checkout source code from Hibernate's
Git repository and build your own snapshot instead of waiting till 07/Mar/12 for 4.1.1
release.
Audited entities with Many-to-Many relationships fail with
NullPointerException
-------------------------------------------------------------------------------
Key: HHH-7073
URL:
https://hibernate.onjira.com/browse/HHH-7073
Project: Hibernate ORM
Issue Type: Bug
Components: envers
Affects Versions: 4.1.0
Reporter: Clement Pang
Assignee: Lukasz Antoniak
Fix For: 4.1.1
Attachments: HHH-7073.ZIP
The entity contains the following field:
@ManyToMany(cascade = {CascadeType.PERSIST})
@JoinTable(
name = "Apples",
joinColumns = {@JoinColumn(name = "storeId", nullable = false)},
inverseJoinColumns = {@JoinColumn(name = "appleId", nullable = false)}
)
public Set<Apple> apples = new HashSet<Apple>();
An exception is thrown when saving the entity:
java.lang.NullPointerException
at
org.hibernate.envers.entities.EntitiesConfigurations.getToPropertyNames(EntitiesConfigurations.java:155)
at
org.hibernate.envers.event.BaseEnversEventListener.addCollectionChangeWorkUnit(BaseEnversEventListener.java:121)
at
org.hibernate.envers.event.BaseEnversEventListener.generateBidirectionalCollectionChangeWorkUnits(BaseEnversEventListener.java:90)
at
org.hibernate.envers.event.EnversPostInsertEventListenerImpl.onPostInsert(EnversPostInsertEventListenerImpl.java:60)
at
org.hibernate.action.internal.EntityIdentityInsertAction.postInsert(EntityIdentityInsertAction.java:149)
at
org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:102)
In that particular method:
public Set<String> getToPropertyNames(String fromEntityName, String
fromPropertyName, String toEntityName) {
Set<String> entityAndParentsNames = getEntityAndParentsNames(fromEntityName);
Set<String> toPropertyNames = new HashSet<String>();
for (RelationDescription relationDescription : getRelationDescriptions(toEntityName))
{
String relToEntityName = relationDescription.getToEntityName();
String mappedByPropertyName = relationDescription.getMappedByPropertyName();
if (entityAndParentsNames.contains(relToEntityName) &&
mappedByPropertyName.equals(fromPropertyName)) {
toPropertyNames.add(relationDescription.getFromPropertyName());
}
}
return toPropertyNames;
}
mappedByPropertyName is null since RelationDescription can have null mappedByPropertyName
when invoked at: EntityConfiguration
public void addToManyMiddleRelation(String fromPropertyName, String toEntityName) {
relations.put(fromPropertyName, new RelationDescription(fromPropertyName,
RelationType.TO_MANY_MIDDLE,
toEntityName, null, null, null, null, true));
}
--
This message is automatically generated by JIRA.
For more information on JIRA, see: