I upgraded to OpenJPA-2.2.1. Still have the same issue.
Here's the route, followed by console output, followed by entities
code. BTW, I notice that the data type of Body coming out
of the jpa endpoint is of type Object[], I think this is part of the
problem, because I put a breakpoint on line 159 in JpaConsumer,
which is:
getDeleteHandler().deleteObject(entityManager, result);
...and that "result" is of type Object[] where each element is a
field value of the entity cooresponding to the
MarketData entity but it's NOT of type MarketData - hence the cast
exception when EntityManager.remove() is called.
Thanks Claus and Christian,
-Chris
from("jpa:entities.MarketData?persistenceUnit=marketdata&consumeDelete=true&consumer.nativeQuery=select
* from market_data where rownum < 10")
.to("log:test.camel?showAll=true&multiline=true&level=INFO")
.to("mock:foo");
1158 marketdata INFO [Camel (camel-1) thread #1 -
jpa://entities.MarketData] openjpa.Runtime - Starting OpenJPA 2.2.1
1236 marketdata INFO [Camel (camel-1) thread #1 -
jpa://entities.MarketData] openjpa.jdbc.JDBC - Using dictionary class
"org.apache.openjpa.jdbc.sql.OracleDictionary".
3661 [Camel (camel-1) thread #1 - jpa://entities.MarketData] INFO
test.camel - Exchange[
, Id:ID-cwolf-55710-1358279796309-0-2
, ExchangePattern:InOnly
,
Properties:{CamelToEndpoint=log://test.camel?level=INFO&multiline=true&showAll=true,
CamelBatchComplete=true, CamelBatchSize=1, CamelCreatedTimestamp=Tue
Jan 15 14:56:39 EST 2013, CamelBatchIndex=0}
, Headers:{CamelJpaTemplate=org.springframework.orm.jpa.JpaTemplate@1e99db4,
breadcrumbId=ID-cwolf-55710-1358279796309-0-1}
, BodyType:Object[]
, Body:[Ljava.lang.Object;@a1e2da
, Out: null
]
3272 [Camel (camel-1) thread #1 - jpa://entities.MarketData] WARN
org.apache.camel.component.jpa.JpaConsumer - Error processing last
message due: <openjpa-2.2.1-r422266:1396819 nonfatal user error>
org.apache.openjpa.persistence.ArgumentException: Attempt to cast
instance "[Ljava.lang.Object;@1cfd3b2" to PersistenceCapable failed.
Ensure that it has been enhanced.
FailedObject: [Ljava.lang.Object;@1cfd3b2. Will commit all previous
successful processed message, and ignore this last failure.
javax.persistence.PersistenceException: <openjpa-2.2.1-r422266:1396819
nonfatal user error> org.apache.openjpa.persistence.ArgumentException:
Attempt to cast instance "[Ljava.lang.Object;@1cfd3b2" to
PersistenceCapable failed. Ensure that it has been enhanced.
FailedObject: [Ljava.lang.Object;@1cfd3b2
at
org.apache.camel.component.jpa.JpaConsumer$1.doInJpa(JpaConsumer.java:102)
at
org.apache.camel.component.jpa.JpaTemplateTransactionStrategy$1$1.doInJpa(JpaTemplateTransactionStrategy.java:82)
at org.springframework.orm.jpa.JpaTemplate.execute(JpaTemplate.java:183)
at org.springframework.orm.jpa.JpaTemplate.execute(JpaTemplate.java:146)
at
org.apache.camel.component.jpa.JpaTemplateTransactionStrategy$1.doInTransaction(JpaTemplateTransactionStrategy.java:80)
at
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130)
at
org.apache.camel.component.jpa.JpaTemplateTransactionStrategy.execute(JpaTemplateTransactionStrategy.java:78)
at org.apache.camel.component.jpa.JpaConsumer.poll(JpaConsumer.java:75)
at
org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:139)
at
org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:91)
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at
java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:180)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:204)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: <openjpa-2.2.1-r422266:1396819 nonfatal user error>
org.apache.openjpa.persistence.ArgumentException: Attempt to cast
instance "[Ljava.lang.Object;@1cfd3b2" to PersistenceCapable failed.
Ensure that it has been enhanced.
FailedObject: [Ljava.lang.Object;@1cfd3b2
at
org.apache.openjpa.kernel.BrokerImpl.assertPersistenceCapable(BrokerImpl.java:4667)
at
org.apache.openjpa.kernel.BrokerImpl.cascadeTransient(BrokerImpl.java:2683)
at org.apache.openjpa.kernel.BrokerImpl.delete(BrokerImpl.java:2771)
at org.apache.openjpa.kernel.BrokerImpl.delete(BrokerImpl.java:2742)
at
org.apache.openjpa.kernel.DelegatingBroker.delete(DelegatingBroker.java:1102)
at
org.apache.openjpa.persistence.EntityManagerImpl.remove(EntityManagerImpl.java:730)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.springframework.orm.jpa.JpaTemplate$CloseSuppressingInvocationHandler.invoke(JpaTemplate.java:425)
at $Proxy14.remove(Unknown Source)
at
org.apache.camel.component.jpa.JpaConsumer$3.deleteObject(JpaConsumer.java:337)
at
org.apache.camel.component.jpa.JpaConsumer.processBatch(JpaConsumer.java:159)
at
org.apache.camel.component.jpa.JpaConsumer$1.doInJpa(JpaConsumer.java:97)
... 18 more
Here is the parent entity (which has collection of child entities)
package entities;
import java.io.Serializable;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Set;
/**
* The persistent class for the MARKET_DATA database table.
*
*/
@Entity
@Table(name="MARKET_DATA")
public class MarketData implements Serializable {
private static final long serialVersionUID = 1L;
private long marketDataId;
private String currencyCode;
private Date dataDate;
private BigDecimal lastPrice;
private BigDecimal lastUpdatedPrice;
private String name;
private String requestId;
private String requestIdType;
private String subType;
private String type;
private String vendorId;
private String vendorName;
private Set<RiskFactor> riskFactors;
public MarketData() {
}
@Id
@SequenceGenerator(name="MARKET_DATA_MARKETDATAID_GENERATOR",
sequenceName="MARKET_DATA_ID_SEQ")
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator="MARKET_DATA_MARKETDATAID_GENERATOR")
@Column(name="MARKET_DATA_ID", unique=true, nullable=false,
precision=19)
public long getMarketDataId() {
return this.marketDataId;
}
public void setMarketDataId(long marketDataId) {
this.marketDataId = marketDataId;
}
@Column(name="CURRENCY_CODE", length=3)
public String getCurrencyCode() {
return this.currencyCode;
}
public void setCurrencyCode(String currencyCode) {
this.currencyCode = currencyCode;
}
@Temporal( TemporalType.DATE)
@Column(name="DATA_DATE")
public Date getDataDate() {
return this.dataDate;
}
public void setDataDate(Date dataDate) {
this.dataDate = dataDate;
}
@Column(name="LAST_PRICE", precision=20, scale=4)
public BigDecimal getLastPrice() {
return this.lastPrice;
}
public void setLastPrice(BigDecimal lastPrice) {
this.lastPrice = lastPrice;
}
@Column(name="LAST_UPDATED_PRICE", precision=20, scale=4)
public BigDecimal getLastUpdatedPrice() {
return this.lastUpdatedPrice;
}
public void setLastUpdatedPrice(BigDecimal lastUpdatedPrice) {
this.lastUpdatedPrice = lastUpdatedPrice;
}
@Column(length=100)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Column(name="REQUEST_ID", length=50)
public String getRequestId() {
return this.requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
@Column(name="REQUEST_ID_TYPE", length=20)
public String getRequestIdType() {
return this.requestIdType;
}
public void setRequestIdType(String requestIdType) {
this.requestIdType = requestIdType;
}
@Column(name="SUB_TYPE", length=100)
public String getSubType() {
return this.subType;
}
public void setSubType(String subType) {
this.subType = subType;
}
@Column(name="\"TYPE\"", length=100)
public String getType() {
return this.type;
}
public void setType(String type) {
this.type = type;
}
@Column(name="VENDOR_ID", length=50)
public String getVendorId() {
return this.vendorId;
}
public void setVendorId(String vendorId) {
this.vendorId = vendorId;
}
@Column(name="VENDOR_NAME", length=100)
public String getVendorName() {
return this.vendorName;
}
public void setVendorName(String vendorName) {
this.vendorName = vendorName;
}
//bi-directional many-to-many association to RiskFactor
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE,
CascadeType.REFRESH})
@JoinTable(
name="MARKET_DATA_RISK_FACTOR"
, joinColumns={
@JoinColumn(name="MARKET_DATA_ID", nullable=false)
}
, inverseJoinColumns={
@JoinColumn(name="RISK_FACTOR_ID", nullable=false)
}
)
public Set<RiskFactor> getRiskFactors() {
return this.riskFactors;
}
public void setRiskFactors(Set<RiskFactor> riskFactors) {
this.riskFactors = riskFactors;
}
}
package entities;
import java.io.Serializable;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Set;
/**
* The persistent class for the RISK_FACTOR database table.
*
*/
@Entity
@Table(name="RISK_FACTOR")
public class RiskFactor implements Serializable {
private static final long serialVersionUID = 1L;
private long riskFactorId;
private Date dataDate;
private String name;
private BigDecimal seq;
private BigDecimal seq2;
private String type;
private BigDecimal value;
private BigDecimal value2;
private Set<MarketData> marketData;
public RiskFactor() {
}
@Id
@SequenceGenerator(name="RISK_FACTOR_RISKFACTORID_GENERATOR",
sequenceName="RISK_FACTOR_ID_SEQ")
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator="RISK_FACTOR_RISKFACTORID_GENERATOR")
@Column(name="RISK_FACTOR_ID", unique=true, nullable=false,
precision=19)
public long getRiskFactorId() {
return this.riskFactorId;
}
public void setRiskFactorId(long riskFactorId) {
this.riskFactorId = riskFactorId;
}
@Temporal( TemporalType.DATE)
@Column(name="DATA_DATE")
public Date getDataDate() {
return this.dataDate;
}
public void setDataDate(Date dataDate) {
this.dataDate = dataDate;
}
@Column(length=100)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Column(precision=1)
public BigDecimal getSeq() {
return this.seq;
}
public void setSeq(BigDecimal seq) {
this.seq = seq;
}
public BigDecimal getSeq2() {
return this.seq2;
}
public void setSeq2(BigDecimal seq2) {
this.seq2 = seq2;
}
@Column(name="\"TYPE\"", length=100)
public String getType() {
return this.type;
}
public void setType(String type) {
this.type = type;
}
@Column(name="\"VALUE\"", precision=20, scale=4)
public BigDecimal getValue() {
return this.value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
@Column(precision=20, scale=4)
public BigDecimal getValue2() {
return this.value2;
}
public void setValue2(BigDecimal value2) {
this.value2 = value2;
}
//bi-directional many-to-many association to MarketData
@ManyToMany(mappedBy="riskFactors")
public Set<MarketData> getMarketData() {
return this.marketData;
}
public void setMarketData(Set<MarketData> marketData) {
this.marketData = marketData;
}
}
On Sat, Jan 12, 2013 at 6:31 AM, Christian Müller
<[email protected]> wrote:
> And by the way, we are using OpenJPA 2.2.1 instead of 2.2.0, which you are
> using. Can you upgrade?
>
> Best,
> Christian
>
> On Fri, Jan 11, 2013 at 8:23 PM, Chris Wolf <[email protected]> wrote:
>
>> I have a JPA endpoint setup as a consumer, just performing a basic
>> query. If I have consumeDelete=false configured,
>> then it works and I see the entities. When consumeDelete=false is not
>> configured (default is to remove), then the error
>> occurs upon JpaTemplate calling EntityManagerImpl.remove(arg) - but
>> "arg" is of type Object[] - not the entity.
>>
>> Second issue is I'd like the route to just perform the query once.
>> As it is, invokes the query in a loop.
>>
>> Thanks
>>
>> Chris
>>
>> P.S. the EntityManagerImpl.remove(arg) issue is not due to the
>> entities not being enhanced - I verified that with javap.
>>
>> FailedObject: [Ljava.lang.Object;@1e3a0ec. Will commit all previous