<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <base href="https://hibernate.atlassian.net" />
<title>Message Title</title>
</head>
<body class="jira" style="color: #333; font-family: Arial, sans-serif; font-size: 14px; line-height: 1.429">
<table id="background-table" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; background-color: #f5f5f5; border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<!-- header here -->
<tr>
<td id="header-pattern-container" style="padding: 0px; border-collapse: collapse; padding: 10px 20px">
<table id="header-pattern" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="header-avatar-image-container" valign="top" style="padding: 0px; border-collapse: collapse; vertical-align: top; width: 32px; padding-right: 8px"> <img id="header-avatar-image" class="image_fix" src="https://secure.gravatar.com/avatar/5720e514e6ae507d79ca64b072ce90c8?d=mm&s=48" height="32" width="32" border="0" style="border-radius: 3px; vertical-align: top" />
</td>
<td id="header-text-container" valign="middle" style="padding: 0px; border-collapse: collapse; vertical-align: middle; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px"> <a class="user-hover" rel="fuzails" id="email_fuzails" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=fuzails" style="color:#6c797f;; color: #3b73af; text-decoration: none">Fuzail Sarang</a> <strong>updated</strong> an issue
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td id="email-content-container" style="padding: 0px; border-collapse: collapse; padding: 0 20px">
<table id="email-content-table" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-spacing: 0; border-collapse: separate">
<tr>
<!-- there needs to be content in the cell for it to render in some clients -->
<td class="email-content-rounded-top mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; padding: 0 15px 0 16px; height: 15px; background-color: #fff; border-left: 1px solid #ccc; border-top: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom: 0; border-top-right-radius: 5px; border-top-left-radius: 5px; height: 10px; line-height: 10px; padding: 0 15px 0 16px; mso-line-height-rule: exactly">
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff">
<table class="page-title-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td class="page-title-pattern-first-line " style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; padding-top: 10px"> <a href="https://hibernate.atlassian.net/browse/HHH" style="color: #3b73af; text-decoration: none">Hibernate ORM</a> / <a href="https://hibernate.atlassian.net/browse/HHH-10246" style="color: #3b73af; text-decoration: none"><img src="cid:jira-generated-image-avatar-9237547e-a3cc-4f91-b9e1-df7c26a713f2" height="16" width="16" border="0" align="absmiddle" alt="Bug" style="vertical-align: text-bottom" /></a> <a href="https://hibernate.atlassian.net/browse/HHH-10246" style="color: #3b73af; text-decoration: none">HHH-10246</a>
</td>
</tr>
<tr>
<td style="vertical-align: top;; padding: 0px; border-collapse: collapse; padding-right: 5px; font-size: 20px; line-height: 30px; mso-line-height-rule: exactly" class="page-title-pattern-header-container"> <span class="page-title-pattern-header" style="font-family: Arial, sans-serif; padding: 0; font-size: 20px; line-height: 30px; mso-text-raise: 2px; mso-line-height-rule: exactly; vertical-align: middle"> <a href="https://hibernate.atlassian.net/browse/HHH-10246" style="color: #3b73af; text-decoration: none">PropertyNotFoundException with Hibernate Envers when using referencedColumn in @JoinColumn and bidirectional @OneTomany</a> </span>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand wrapper-special-margin" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff; padding-top: 10px; padding-bottom: 5px">
<table class="keyvalue-table" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Change By:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top"> <a class="user-hover" rel="fuzails" id="email_fuzails" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=fuzails" style="color:#6c797f;; color: #3b73af; text-decoration: none">Fuzail Sarang</a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand issue-description-container" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff; padding-top: 5px; padding-bottom: 10px">
<table class="text-paragraph-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 2px">
<tr>
<td class="text-paragraph-pattern-container mobile-resize-text " style="padding: 0px; border-collapse: collapse; padding: 0 0 10px 0"> <span class="diffcontext">We get the following error message when persisting/updating/deleting associations:<br />{code}<br />Caused by: org.hibernate.PropertyNotFoundException: Could not locate getter method for property [co.fingerprintsoft.spring.hibernate.audit.Customer#null]<br /> at org.hibernate.internal.util.ReflectHelper.findGetterMethod(ReflectHelper.java:400)<br /> at org.hibernate.property.access.internal.PropertyAccessBasicImpl.<init>(PropertyAccessBasicImpl.java:41)<br /> at org.hibernate.property.access.internal.PropertyAccessStrategyBasicImpl.buildPropertyAccess(PropertyAccessStrategyBasicImpl.java:27)<br /> at org.hibernate.envers.internal.tools.ReflectionTools.getGetter(ReflectionTools.java:53)<br /> at org.hibernate.envers.internal.tools.ReflectionTools.getGetter(ReflectionTools.java:46)<br /> at org.hibernate.envers.internal.entities.mapper.MultiPropertyMapper.mapToMapFromEntity(MultiPropertyMapper.java:105)<br /> at org.hibernate.envers.internal.synchronization.work.CollectionChangeWorkUnit.generateData(CollectionChangeWorkUnit.java:48)<br /> at org.hibernate.envers.internal.synchronization.work.AbstractAuditWorkUnit.perform(AbstractAuditWorkUnit.java:62)<br /> at org.hibernate.envers.internal.synchronization.AuditProcess.executeInSession(AuditProcess.java:106)<br /> at org.hibernate.envers.internal.synchronization.AuditProcess.doBeforeTransactionCompletion(AuditProcess.java:153)<br /> at org.hibernate.envers.internal.synchronization.AuditProcessManager$1.doBeforeTransactionCompletion(AuditProcessManager.java:46)<br /> at org.hibernate.engine.spi.ActionQueue$BeforeTransactionCompletionProcessQueue.beforeTransactionCompletion(ActionQueue.java:706)<br /> at org.hibernate.engine.spi.ActionQueue.beforeTransactionCompletion(ActionQueue.java:373)<br /> at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2271)<br /> at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485)<br /> at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:146)<br /> at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)<br /> at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:230)<br /> at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)<br /> at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:61){code}<br />We have tracked down the error to:<br />{code}<br /> @Override<br /> public boolean mapToMapFromEntity(<br /> SessionImplementor session,<br /> Map<String, Object> data,<br /> Object newObj,<br /> Object oldObj) {<br /> boolean ret = false;<br /> for ( PropertyData propertyData : properties.keySet() ) {<br /> Getter getter;<br /> if ( newObj != null ) {<br /> getter = ReflectionTools.getGetter( newObj.getClass(), propertyData, session.getFactory().getServiceRegistry() );<br /> }<br /> else if ( oldObj != null ) {<br /> getter = ReflectionTools.getGetter( oldObj.getClass(), propertyData, session.getFactory().getServiceRegistry() );<br /> }<br /> else {<br /> return false;<br /> }<br /><br /> ret |= properties.get( propertyData ).mapToMapFromEntity(<br /> session, data,<br /> newObj == null ? null : getter.get( newObj ),<br /> oldObj == null ? null : getter.get( oldObj )<br /> );<br /> }<br /><br /> return ret;<br /> }<br />{code}<br />Specifically the line:<br />{code}<br /> getter = ReflectionTools.getGetter( newObj.getClass(), propertyData, session.getFactory().getServiceRegistry() );</span> <span class="diffaddedchars" style="background-color:#ddfade;"> //Line 105: org.hibernate.envers.internal.entities.mapper.MultiPropertyMapper</span> <span class="diffcontext"><br /></span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"> }<br /></span> <span class="diffcontext">{code}<br />To replicate the error:<br />h5. Customer.java<br />{code:java}<br />import java.io.Serializable;<br />import java.util.ArrayList;<br />import java.util.Collection;<br />import java.util.HashSet;<br />import java.util.Set;<br /><br />import javax.persistence.CascadeType;<br />import javax.persistence.Entity;<br />import javax.persistence.GeneratedValue;<br />import javax.persistence.GenerationType;<br />import javax.persistence.Id;<br />import javax.persistence.OneToMany;<br />import javax.validation.constraints.Size;<br /><br />import org.hibernate.annotations.NaturalId;<br />import org.hibernate.envers.Audited;<br />import org.hibernate.validator.constraints.Length;<br /><br />import com.sun.istack.internal.NotNull;<br /><br />@Entity<br />@Audited<br />public class Customer implements Serializable {<br /><br /> @Id<br /> @GeneratedValue(strategy = GenerationType.IDENTITY)<br /> private Long id;<br /> @NaturalId<br /> @NotNull<br /> @Length(min = 6, max = 6)<br /> private String customerNumber;<br /><br /> @Audited<br /> @OneToMany(mappedBy = "customer")<br /> private Collection<Account> accounts = new ArrayList();<br /><br /> @Size(max = 10, message = "{Size.customer.devices}")<br /> @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)<br /> private Set<Device> devices = new HashSet();<br /><br /> public String getCustomerNumber() {<br /> return customerNumber;<br /> }<br /><br /> public void setCustomerNumber(String customerNumber) {<br /> this.customerNumber = customerNumber;<br /> }<br /><br /> public Collection<Account> getAccounts() {<br /> return accounts;<br /> }<br /><br /> public void setAccounts(Collection<Account> accounts) {<br /> this.accounts = accounts;<br /> }<br /><br /> public Set<Device> getDevices() {<br /> return devices;<br /> }<br /><br /> public void setDevices(Set<Device> devices) {<br /> this.devices = devices;<br /> }<br />}<br />{code} <br />h5. Account.java<br />{code:java}<br />import javax.persistence.Entity;<br />import javax.persistence.ForeignKey;<br />import javax.persistence.GeneratedValue;<br />import javax.persistence.GenerationType;<br />import javax.persistence.Id;<br />import javax.persistence.JoinColumn;<br />import javax.persistence.ManyToOne;<br />import javax.validation.constraints.NotNull;<br /><br />import org.hibernate.envers.Audited;<br /><br />@Entity<br />@Audited<br />public class Account {<br /><br /><br /> @Id<br /> @GeneratedValue(strategy = GenerationType.IDENTITY)<br /> private Long id;<br /><br /> @Audited<br /> @ManyToOne<br /> @JoinColumn(<br /> name = "customer_customernumber",<br /> referencedColumnName = "customerNumber",<br /> columnDefinition = "VARCHAR(6)",<br /> foreignKey = @ForeignKey(name = "fk_acc_cust_custnumber")<br /><br /> )<br /> @NotNull<br /> private Customer customer;<br /><br /> public Long getId() {<br /> return id;<br /> }<br /><br /> public void setId(Long id) {<br /> this.id = id;<br /> }<br /><br /> public Customer getCustomer() {<br /> return customer;<br /> }<br /><br /> public void setCustomer(Customer customer) {<br /> this.customer = customer;<br /> }<br />}<br />{code}<br />h5. Device.java<br />{code:java}<br />import javax.persistence.Entity;<br />import javax.persistence.ForeignKey;<br />import javax.persistence.GeneratedValue;<br />import javax.persistence.GenerationType;<br />import javax.persistence.Id;<br />import javax.persistence.JoinColumn;<br />import javax.persistence.ManyToOne;<br /><br />import org.hibernate.envers.Audited;<br /><br />@Entity<br />@Audited<br />public class Device {<br /><br /> @Id<br /> @GeneratedValue(strategy = GenerationType.IDENTITY)<br /> private Long id;<br /><br /> @Audited<br /> @ManyToOne<br /> @JoinColumn(name = "customer_id",<br /> foreignKey = @ForeignKey(name = "fk_dev_cust_id")<br /> )<br /> private Customer customer;<br /><br /> public Long getId() {<br /> return id;<br /> }<br /><br /> public void setId(Long id) {<br /> this.id = id;<br /> }<br /><br /> public Customer getCustomer() {<br /> return customer;<br /> }<br /><br /> public void setCustomer(Customer customer) {<br /> this.customer = customer;<br /> }<br />}<br />{code}<br />h5. Scenario<br />{code:java}<br /> Customer customer = new Customer();<br /> customer.setCustomerNumber("123457");<br /> entityManager.getTransaction().begin();<br /> entityManager.persist(customer);<br /> entityManager.getTransaction().commit();<br /><br /> Device device = new Device();<br /> device.setCustomer(customer);<br /><br /> Account account = new Account();<br /> account.setCustomer(customer);<br /> entityManager.getTransaction().begin();<br /> entityManager.persist(account);<br /> entityManager.getTransaction().commit();<br /> entityManager.getTransaction().begin();<br /> entityManager.remove(account);<br /> entityManager.getTransaction().commit();<br />{code}<br />The problem stems from the fact that the property is not correctly identified in the PropertyData field:<br />{code}<br />propertyData = {PropertyData@6977} <br />name = {String@6983} "_co_fingerprintsoft_spring_hibernate_audit_Account_customer"<br />beanName = null<br />accessType = {String@6984} "property"<br />store = {ModificationStore@6908} "FULL"<br />usingModifiedFlag = false<br />modifiedFlagName = {String@6985} "customerNumber_MOD"<br />{code}</span>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff">
<table id="actions-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px">
<tr>
<td id="actions-pattern-container" valign="middle" style="padding: 0px; border-collapse: collapse; padding: 10px 0 10px 24px; vertical-align: middle; padding-left: 0">
<table align="left" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td class="actions-pattern-action-icon-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 0px; vertical-align: middle"> <a href="https://hibernate.atlassian.net/browse/HHH-10246#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none"> <img class="actions-pattern-action-icon-image" src="cid:jira-generated-image-static-comment-icon-079b6c88-6d2a-463b-a7b6-422adee94a0a" alt="Add Comment" title="Add Comment" height="16" width="16" border="0" style="vertical-align: middle" /> </a>
</td>
<td class="actions-pattern-action-text-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; padding-left: 5px"> <a href="https://hibernate.atlassian.net/browse/HHH-10246#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none">Add Comment</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- there needs to be content in the cell for it to render in some clients -->
<tr>
<td class="email-content-rounded-bottom mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; padding: 0 15px 0 16px; height: 5px; line-height: 5px; background-color: #fff; border-top: 0; border-left: 1px solid #ccc; border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; mso-line-height-rule: exactly">
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td id="footer-pattern" style="padding: 0px; border-collapse: collapse; padding: 12px 20px">
<table id="footer-pattern-container" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="footer-pattern-text" class="mobile-resize-text" width="100%" style="padding: 0px; border-collapse: collapse; color: #999; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px">
This message was sent by Atlassian JIRA <span id="footer-build-information">(v7.0.0-OD-08-005#70107-<span title="5fb2f7e0c016d05ff672e1e32fcd963de6cf92ae" data-commit-id="5fb2f7e0c016d05ff672e1e32fcd963de6cf92ae}">sha1:5fb2f7e</span>)</span>
</td>
<td id="footer-pattern-logo-desktop-container" valign="top" style="padding: 0px; border-collapse: collapse; padding-left: 20px; vertical-align: top">
<table style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="footer-pattern-logo-desktop-padding" style="padding: 0px; border-collapse: collapse; padding-top: 3px"> <img id="footer-pattern-logo-desktop" src="cid:jira-generated-image-static-footer-desktop-logo-09eacec7-9996-44b9-b839-5343a8a31094" alt="Atlassian logo" title="Atlassian logo" width="169" height="36" class="image_fix" />
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>