mirror of https://github.com/apache/openjpa.git
OPENJPA-1900: Fix ClassCastException when serializing a proxy for an Entity that exists in an active persistence context. Patch contributed by Mark Struberg.
git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@1050168 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
aedc8d9dd0
commit
b6024187ba
|
@ -0,0 +1,98 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.openjpa.persistence.proxy;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
|
||||||
|
import org.apache.openjpa.lib.log.Log;
|
||||||
|
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
|
||||||
|
import org.apache.openjpa.persistence.OpenJPAPersistence;
|
||||||
|
import org.apache.openjpa.persistence.proxy.entities.Address;
|
||||||
|
import org.apache.openjpa.persistence.proxy.entities.Annuity;
|
||||||
|
import org.apache.openjpa.persistence.proxy.entities.AnnuityHolder;
|
||||||
|
import org.apache.openjpa.persistence.proxy.entities.AnnuityPersistebleObject;
|
||||||
|
import org.apache.openjpa.persistence.proxy.entities.Contact;
|
||||||
|
import org.apache.openjpa.persistence.proxy.entities.EquityAnnuity;
|
||||||
|
import org.apache.openjpa.persistence.proxy.entities.FixedAnnuity;
|
||||||
|
import org.apache.openjpa.persistence.proxy.entities.Payor;
|
||||||
|
import org.apache.openjpa.persistence.proxy.entities.Payout;
|
||||||
|
import org.apache.openjpa.persistence.proxy.entities.Person;
|
||||||
|
import org.apache.openjpa.persistence.proxy.entities.Rider;
|
||||||
|
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for showing OPENJPA-1900
|
||||||
|
*/
|
||||||
|
public class TestEntitySerialize extends SingleEMFTestCase {
|
||||||
|
|
||||||
|
public void setUp() {
|
||||||
|
setUp(DROP_TABLES, Address.class, Annuity.class, AnnuityHolder.class, AnnuityPersistebleObject.class,
|
||||||
|
Contact.class, EquityAnnuity.class, FixedAnnuity.class, Payor.class, Payout.class, Person.class,
|
||||||
|
Rider.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSerialization() throws Exception {
|
||||||
|
OpenJPAEntityManagerFactorySPI emf =
|
||||||
|
(OpenJPAEntityManagerFactorySPI) OpenJPAPersistence.createEntityManagerFactory("Annuity1Compat",
|
||||||
|
"org/apache/openjpa/persistence/proxy/persistence1.xml");
|
||||||
|
assertNotNull(emf);
|
||||||
|
|
||||||
|
EntityManager em = emf.createEntityManager();
|
||||||
|
try {
|
||||||
|
em.getTransaction().begin();
|
||||||
|
Annuity ann = createAnnuity(em);
|
||||||
|
|
||||||
|
// Make sure that we can detach an Entity via serialization that is currently associated
|
||||||
|
// with a persistence context
|
||||||
|
assertNotNull(roundtrip(ann));
|
||||||
|
em.getTransaction().commit();
|
||||||
|
} finally {
|
||||||
|
closeEM(em);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Annuity createAnnuity(EntityManager em) {
|
||||||
|
FixedAnnuity fixedAnn = new FixedAnnuity();
|
||||||
|
((FixedAnnuity) fixedAnn).setRate(10.0);
|
||||||
|
fixedAnn.setId(getId());
|
||||||
|
fixedAnn.setAmount(500.00);
|
||||||
|
fixedAnn.setAccountNumber("123456");
|
||||||
|
em.persist(fixedAnn);
|
||||||
|
|
||||||
|
EquityAnnuity equityAnn = new EquityAnnuity();
|
||||||
|
equityAnn.setId(getId());
|
||||||
|
equityAnn.setAmount(500.00);
|
||||||
|
equityAnn.setAccountNumber("123456");
|
||||||
|
equityAnn.setFundNames("Something nothing wrong");
|
||||||
|
equityAnn.setIndexRate(10.99);
|
||||||
|
equityAnn.setLastPaidAmt(100.00);
|
||||||
|
equityAnn.setPreviousAnnuity(fixedAnn);
|
||||||
|
em.persist(equityAnn);
|
||||||
|
|
||||||
|
return equityAnn;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getId() {
|
||||||
|
UUID uid = UUID.randomUUID();
|
||||||
|
return uid.toString();
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,6 +20,7 @@ package org.apache.openjpa.persistence.proxy.entities;
|
||||||
|
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.persistence.AttributeOverride;
|
import javax.persistence.AttributeOverride;
|
||||||
|
@ -28,6 +29,7 @@ import javax.persistence.Column;
|
||||||
import javax.persistence.DiscriminatorColumn;
|
import javax.persistence.DiscriminatorColumn;
|
||||||
import javax.persistence.DiscriminatorType;
|
import javax.persistence.DiscriminatorType;
|
||||||
import javax.persistence.DiscriminatorValue;
|
import javax.persistence.DiscriminatorValue;
|
||||||
|
import javax.persistence.ElementCollection;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.FetchType;
|
import javax.persistence.FetchType;
|
||||||
import javax.persistence.Inheritance;
|
import javax.persistence.Inheritance;
|
||||||
|
@ -36,6 +38,9 @@ import javax.persistence.JoinColumn;
|
||||||
import javax.persistence.JoinTable;
|
import javax.persistence.JoinTable;
|
||||||
import javax.persistence.ManyToMany;
|
import javax.persistence.ManyToMany;
|
||||||
import javax.persistence.OneToMany;
|
import javax.persistence.OneToMany;
|
||||||
|
import javax.persistence.OneToOne;
|
||||||
|
import javax.persistence.Temporal;
|
||||||
|
import javax.persistence.TemporalType;
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
|
@ -53,7 +58,10 @@ public class Annuity extends AnnuityPersistebleObject implements IAnnuity {
|
||||||
private List<IPayout> payouts = new ArrayList<IPayout>();
|
private List<IPayout> payouts = new ArrayList<IPayout>();
|
||||||
private List<IRider> riders = new ArrayList<IRider>();
|
private List<IRider> riders = new ArrayList<IRider>();
|
||||||
private List<IPayor> payors = new ArrayList<IPayor>();
|
private List<IPayor> payors = new ArrayList<IPayor>();
|
||||||
|
private List<String> comments;
|
||||||
|
private Date approvedAt;
|
||||||
|
|
||||||
|
private Annuity previousAnnuity;
|
||||||
public Annuity(){
|
public Annuity(){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,7 +142,27 @@ public class Annuity extends AnnuityPersistebleObject implements IAnnuity {
|
||||||
this.riders = riders;
|
this.riders = riders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ElementCollection
|
||||||
|
public List<String> getComments() {
|
||||||
|
return comments;
|
||||||
|
}
|
||||||
|
public void setComments(List<String> comments) {
|
||||||
|
this.comments = comments;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Temporal(TemporalType.DATE)
|
||||||
|
public Date getApprovedAt() {
|
||||||
|
return approvedAt;
|
||||||
|
}
|
||||||
|
public void setApprovedAt(Date approvedAt) {
|
||||||
|
this.approvedAt = approvedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
@OneToOne
|
||||||
|
public Annuity getPreviousAnnuity() {
|
||||||
|
return previousAnnuity;
|
||||||
|
}
|
||||||
|
public void setPreviousAnnuity(Annuity previousAnnuity) {
|
||||||
|
this.previousAnnuity = previousAnnuity;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
package org.apache.openjpa.persistence.proxy.entities;
|
package org.apache.openjpa.persistence.proxy.entities;
|
||||||
|
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
|
import java.text.ParseException;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
||||||
import javax.persistence.DiscriminatorValue;
|
import javax.persistence.DiscriminatorValue;
|
||||||
|
@ -48,12 +49,22 @@ public class EquityAnnuity extends Annuity implements IEquityAnnuity {
|
||||||
return indexRate;
|
return indexRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setIndexRate(Double indexRate) {
|
public void setIndexRate(Double indexRate) {
|
||||||
this.indexRate = indexRate;
|
if (indexRate != null) {
|
||||||
if (this.indexRate != null) {
|
DecimalFormat df = new DecimalFormat("#.##");
|
||||||
DecimalFormat df = new DecimalFormat("#.##");
|
try
|
||||||
this.indexRate= new Double(df.format(indexRate));
|
{
|
||||||
}
|
// parse back via the DateFormat because countries might use ',' as comma separator
|
||||||
}
|
this.indexRate= df.parse(df.format(indexRate)).doubleValue();
|
||||||
|
}
|
||||||
|
catch (ParseException e)
|
||||||
|
{
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.indexRate = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.openjpa.persistence.proxy.entities;
|
package org.apache.openjpa.persistence.proxy.entities;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface IAnnuity extends IAnnuityObject {
|
public interface IAnnuity extends IAnnuityObject {
|
||||||
|
@ -45,5 +46,13 @@ public interface IAnnuity extends IAnnuityObject {
|
||||||
|
|
||||||
public abstract List<IPayor> getPayors();
|
public abstract List<IPayor> getPayors();
|
||||||
public abstract void setPayors(List<IPayor> payors);
|
public abstract void setPayors(List<IPayor> payors);
|
||||||
|
|
||||||
|
public abstract List<String> getComments();
|
||||||
|
public abstract void setComments(List<String> comments);
|
||||||
|
|
||||||
|
public abstract Date getApprovedAt();
|
||||||
|
public void setApprovedAt(Date approvedAt);
|
||||||
|
|
||||||
|
public Annuity getPreviousAnnuity();
|
||||||
|
public void setPreviousAnnuity(Annuity previousAnnuity);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue