Am 15.01.13 21:22 schrieb "Chris Wolf" unter <[email protected]>:

>I upgraded to OpenJPA-2.2.1.  Still have the same issue.

Hi

The problem you're facing is that the byte-code of your JPA entity has not
been enhanced, see your stack trace where it says "Ensure that it has been
enhanced." Also take a look at the source where that exception is thrown:

org.apache.openjpa.kernel.BrokerImpl.assertPersistenceCapable(BrokerImpl.ja
va:4667)

When enhancement gets done properly then the byte code of your entity
class gets instrumentalized to implement the interface
org.apache.openjpa.enhance.PersistenceCapable (this's of course in case of
OpenJPA).

No matter which JPA provider you make use of (OpenJPA, Hibernate or
Eclipselink) @ runtime you should make sure that the entity class byte
code has been enhanced/weaved properly. This can be done either statically
or dynamically. Recently I added a note about this on the Camel JPA
component documentation which could be helpful for your use case. See the
blue box at the bottom here:

http://camel.apache.org/jpa.html

In that box there's also a link pointing to the corresponding OpenJPA
documentation about this. You can also look at the camel-jpa POM itself to
see how the static enhancement is done. However in your case you would
need to make use of the "enhance" goal and not "test-enhance".

Babak

>
>
>
>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=tru
>e&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&sho
>wAll=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.doInTransa
>ction(JpaTemplateTransactionStrategy.java:80)
>       at 
>org.springframework.transaction.support.TransactionTemplate.execute(Transa
>ctionTemplate.java:130)
>       at 
>org.apache.camel.component.jpa.JpaTemplateTransactionStrategy.execute(JpaT
>emplateTransactionStrategy.java:78)
>       at org.apache.camel.component.jpa.JpaConsumer.poll(JpaConsumer.java:75)
>       at 
>org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.ja
>va: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.acces
>s$101(ScheduledThreadPoolExecutor.java:98)
>       at 
>java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPe
>riodic(ScheduledThreadPoolExecutor.java:180)
>       at 
>java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(S
>cheduledThreadPoolExecutor.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.j
>ava: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:11
>02)
>       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(DelegatingMethodAccessorIm
>pl.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:1
>59)
>       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


Reply via email to