[
https://issues.apache.org/jira/browse/OPENJPA-218?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Fay Wang resolved OPENJPA-218.
------------------------------
Resolution: Fixed
Fix Version/s: 2.0.0
> 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
> Fix For: 2.0.0
>
> Attachments: OPENJPA-218-testcase.patch, OPENJPA-218.patch
>
>
> 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.