[
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.