Sorry, didn't see that one. Glad to hear it's resolved.
On Wed, Jan 16, 2013 at 7:09 AM, Chris Wolf <[email protected]> wrote: > James, > > Sorry, I think I broke the thread by appending "*** PROBLEM SOLVED > ***" to the subject (See mail traffic from last night around 9PM). > The issue the whole time was my not having used the > "consumer.resultClass" option. > > Thanks, > > -Chris > > On Wed, Jan 16, 2013 at 6:51 AM, James Carman > <[email protected]> wrote: >> Are you using the same version of OpenJPA to enhance your classes that >> you're using at runtime? >> >> On Tue, Jan 15, 2013 at 5:11 PM, Chris Wolf <[email protected]> wrote: >>> Babak, >>> >>> Thanks for the detailed reply, but if you look at my first post on >>> this thread, I mentioned that that error message concerning >>> enhancement is misleading. If I configure "consumeDelete=false", >>> there's no error - the entities are created by JPA. >>> I also mentioned I verified enhancement by observing the added fields, >>> methods and interfaces via the "javap" (decompiler) tool. >>> >>> I didn't know about the test-enhance goal, so that was good to learn, >>> thanks. >>> (my entities are under main/java, so I just use the "enhance" goal) >>> >>> -Chris >>> >>> >>> On Tue, Jan 15, 2013 at 4:05 PM, Babak Vahdat >>> <[email protected]> wrote: >>>> >>>> >>>> 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 >>>> >>>>
