[ 
https://issues.apache.org/jira/browse/OPENJPA-218?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12489418
 ] 

Markus Wolf commented on OPENJPA-218:
-------------------------------------

To be more complete I'll attach the NPE stacktrace:

java.lang.NullPointerException
        at 
de.esw.services.model.DomainRecord.pcCopyKeyFieldsFromObjectId(DomainRecord.java)
        at de.esw.services.model.DomainRecord.pcNewInstance(DomainRecord.java)
        at 
org.apache.openjpa.kernel.AttachStrategy.persist(AttachStrategy.java:89)
        at 
org.apache.openjpa.kernel.VersionAttachStrategy.attach(VersionAttachStrategy.java:85)
        at 
org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:236)
        at org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:97)
        at org.apache.openjpa.kernel.BrokerImpl.attach(BrokerImpl.java:3124)
        at 
org.apache.openjpa.kernel.DelegatingBroker.attach(DelegatingBroker.java:1120)
        at 
org.apache.openjpa.persistence.EntityManagerImpl.merge(EntityManagerImpl.java:591)
        at 
org.springframework.orm.jpa.JpaTemplate$6.doInJpa(JpaTemplate.java:272)
        at org.springframework.orm.jpa.JpaTemplate.execute(JpaTemplate.java:191)
        at org.springframework.orm.jpa.JpaTemplate.merge(JpaTemplate.java:270)
        at 
de.esw.services.domain.DomainRecordProcessorImpl.update(DomainRecordProcessorImpl.java:53)

> pcNewInstance and ApplicationId
> -------------------------------
>
>                 Key: OPENJPA-218
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-218
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 0.9.6, 0.9.7
>         Environment: Java 6
>            Reporter: Markus Wolf
>
> When using an application id class containing a reference to another entity 
> (example given below) a NPE is thrown when merging/reattaching the instance 
> to an entity manager. 
> The problem is caused by the involved AttachStrategy where on line 89 
> (pc.pcNewInstance(null, appId, false);) the call to pcNewInstance is null for 
> the first parameter (StateManager). This statemanager is used to retrieve the 
> object reference when reattaching using the method 
> pcCopyKeyFieldsFromObjectId in the pcNewInstance method.
> Source for this bug:
> @Entity
> @Table(name = "domain_record")
> @IdClass(DomainRecord.DomainRecordId.class)
> public class DomainRecord implements Serializable {
>       private static final long serialVersionUID = 2966781630801201103L;
>       public static class DomainRecordId implements Serializable {
>               private static final long serialVersionUID = 
> 3629556841694516032L;
>               private String zone;
>               private String name;
>               private Type type;
>               private String data;
>               public DomainRecordId() {
>               }
>               public DomainRecordId(DomainRecord record) {
>                       this.zone = record.zone.getName();
>                       this.name = record.name;
>                       this.type = record.type;
>                       this.data = record.data;
>               }
>               public DomainRecordId(String zone, String name, Type type, 
> String data) {
>                       this.zone = zone;
>                       this.name = name;
>                       this.type = type;
>                       this.data = data;
>               }
>               /**
>                * @see java.lang.Object#hashCode()
>                */
>               @Override
>               public int hashCode() {
>                       final int PRIME = 31;
>                       int result = 1;
>                       result = PRIME * result + ((data == null) ? 0 : 
> data.hashCode());
>                       result = PRIME * result + ((name == null) ? 0 : 
> name.hashCode());
>                       result = PRIME * result + ((type == null) ? 0 : 
> type.hashCode());
>                       result = PRIME * result + ((zone == null) ? 0 : 
> zone.hashCode());
>                       return result;
>               }
>               /**
>                * @see java.lang.Object#equals(java.lang.Object)
>                */
>               @Override
>               public boolean equals(Object obj) {
>                       if (this == obj)
>                               return true;
>                       if (obj == null)
>                               return false;
>                       if (getClass() != obj.getClass())
>                               return false;
>                       final DomainRecordId other = (DomainRecordId) obj;
>                       if (data == null) {
>                               if (other.data != null)
>                                       return false;
>                       } else if (!data.equals(other.data))
>                               return false;
>                       if (name == null) {
>                               if (other.name != null)
>                                       return false;
>                       } else if (!name.equals(other.name))
>                               return false;
>                       if (type == null) {
>                               if (other.type != null)
>                                       return false;
>                       } else if (!type.equals(other.type))
>                               return false;
>                       if (zone == null) {
>                               if (other.zone != null)
>                                       return false;
>                       } else if (!zone.equals(other.zone))
>                               return false;
>                       return true;
>               }
>       }
>       /**
>        * @author markusw
>        * @version $Revision$
>        */
>       public enum Type {
>               A, AAAA, ALIAS, CNAME, HINFO, MX, NAPTR, NS, PTR, RP, SRV, TXT
>       }
>       @Id
>       @ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
>       @JoinColumn(name = "domain", referencedColumnName = "name")
>       private Domain zone;
>       @Id
>       @Column(length = 64)
>       private String name;
>       @Id
>       @Enumerated(EnumType.STRING)
>       private Type type;
>       @Id
>       @Column(length = 128)
>       private String data;
> ...
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to