Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

    Bug in JPA2DataSource

    Hello,
    I'm use SC_SNAPSHOT-2011-08-02/EVAL Deployment 2011-08-02

    I have entity class OrderItem with @embeddedId
    Code:
    @Entity
    @Table(name="orderItems")
    public class OrderItem implements Serializable {
    	private static final long serialVersionUID = 1L;
    
    	@EmbeddedId
    	private OrderItemPK id;
    
    	private BigDecimal quantity;
    
    	//bi-directional many-to-one association to Item
        @ManyToOne
        @JoinColumn(insertable=false, updatable=false)
    	private Item item;
    
    	//bi-directional many-to-one association to Order
        @ManyToOne
        @JoinColumn(insertable=false, updatable=false)
    	private Order order;
    
        public OrderItem() {
        }
    
    	public OrderItemPK getId() {
    		return this.id;
    	}
    
    	public void setId(OrderItemPK id) {
    		this.id = id;
    	}
    	
    	public BigDecimal getQuantity() {
    		return this.quantity;
    	}
    
    	public void setQuantity(BigDecimal quantity) {
    		this.quantity = quantity;
    	}
    
    	public Item getItem() {
    		return this.item;
    	}
    
    	public void setItem(Item item) {
    		this.item = item;
    	}
    	
    	public Order getOrder() {
    		return this.order;
    	}
    
    	public void setOrder(Order order) {
    		this.order = order;
    	}
    	
    }
    Code:
    @Embeddable
    public class OrderItemPK implements Serializable {
    	//default serial version id, required for serializable classes.
    	private static final long serialVersionUID = 1L;
    
    	@Column(name="order_id")
    	private String orderId;
    
    	@Column(name="item_id")
    	private String itemId;
    
        public OrderItemPK() {
        }
    	public String getOrderId() {
    		return this.orderId;
    	}
    	public void setOrderId(String orderId) {
    		this.orderId = orderId;
    	}
    	public String getItemId() {
    		return this.itemId;
    	}
    	public void setItemId(String itemId) {
    		this.itemId = itemId;
    	}
    
    	public boolean equals(Object other) {
    		if (this == other) {
    			return true;
    		}
    		if (!(other instanceof OrderItemPK)) {
    			return false;
    		}
    		OrderItemPK castOther = (OrderItemPK)other;
    		return 
    			this.orderId.equals(castOther.orderId)
    			&& this.itemId.equals(castOther.itemId);
    
        }
        
    	public int hashCode() {
    		final int prime = 31;
    		int hash = 17;
    		hash = hash * prime + this.orderId.hashCode();
    		hash = hash * prime + this.itemId.hashCode();
    		
    		return hash;
        }
    }
    orderItem.ds.xml
    Code:
    <DataSource ID="orderItem" serverConstructor="com.isomorphic.jpa.JPA2DataSource"
        beanClassName="com.smarterp.server.orm.OrderItem"
        schemaBean="com.smarterp.server.orm.OrderItem">
    </DataSource>
    when i try fetch data, i see
    Code:
    === 2011-08-30 23:56:07,282 [l0-4] DEBUG RPCManager - Processing 1 requests.
    === 2011-08-30 23:56:07,287 [l0-4] DEBUG DataSource - In DS.forName() for 'orderItem' with DSRequest: com.isomorphic.datasource.DSRequest@3ce02577
    === 2011-08-30 23:56:07,288 [l0-4] DEBUG DataSource - Creating instance of DataSource 'orderItem'
    === 2011-08-30 23:56:07,288 [l0-4] DEBUG RPCManager - Request #1 (DSRequest) payload: {
        criteria:{
        },
        operationConfig:{
            dataSource:"orderItem",
            operationType:"fetch",
            textMatchStyle:"substring"
        },
        startRow:0,
        endRow:999,
        componentId:"isc_ListGrid_0",
        appID:"builtinApplication",
        operation:"orderItem_fetch",
        oldValues:{
        }
    }
    === 2011-08-30 23:56:07,290 [l0-4] INFO  IDACall - Performing 1 operation(s)
    === 2011-08-30 23:56:07,294 [l0-4] DEBUG AppBase - [builtinApplication.orderItem_fetch] No userTypes defined, allowing anyone access to all operations for this application
    === 2011-08-30 23:56:07,295 [l0-4] DEBUG AppBase - [builtinApplication.orderItem_fetch] No public zero-argument method named '_orderItem_fetch' found, performing generic datasource operation
    === 2011-08-30 23:56:07,295 [l0-4] DEBUG JPADataSource - [builtinApplication.orderItem_fetch] Creating EntityManager and starting transaction.
    === 2011-08-30 23:56:07,297 [l0-4] DEBUG DSRequest - [builtinApplication.orderItem_fetch] Clobbering existing FreeResourcesHandler of type 'com.isomorphic.jpa.JPA2DataSource' with a 'com.isomorphic.jpa.JPA2DataSource'
    === 2011-08-30 23:56:07,297 [l0-4] DEBUG JPA2DataSource - [builtinApplication.orderItem_fetch] Executing fetch.
    Hibernate: 
        select
            count((orderitem0_.item_id,
            orderitem0_.order_id)) as col_0_0_ 
        from
            orderItems orderitem0_ limit ?
    23:56:07,412  WARN JDBCExceptionReporter:233 - SQL Error: 1241, SQLState: 21000
    23:56:07,413 ERROR JDBCExceptionReporter:234 - Operand should contain 1 column(s)
    === 2011-08-30 23:56:07,413 [l0-4] DEBUG JPADataSource - [builtinApplication.orderItem_fetch] Marking transaction for roll back.
    === 2011-08-30 23:56:07,414 [l0-4] DEBUG JPADataSource - [builtinApplication.orderItem_fetch] Got exception while executing. Transaction will be rolled back.
    javax.persistence.PersistenceException: org.hibernate.exception.DataException: could not execute query
    	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1215)
    	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1148)
    	at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:307)
    	at org.hibernate.ejb.criteria.CriteriaQueryCompiler$3.getSingleResult(CriteriaQueryCompiler.java:264)
    	at com.isomorphic.jpa.JPA2DataSource.executeFetch(JPA2DataSource.java:304)
    	at com.isomorphic.datasource.DataSource.execute(DataSource.java:1154)
    	at com.isomorphic.jpa.JPADataSource.execute(JPADataSource.java:356)
    	at com.isomorphic.application.AppBase.executeDefaultDSOperation(AppBase.java:721)
    	at com.isomorphic.application.AppBase.executeAppOperation(AppBase.java:658)
    	at com.isomorphic.application.AppBase.execute(AppBase.java:491)
    	at com.isomorphic.datasource.DSRequest.execute(DSRequest.java:1714)
    	at com.isomorphic.servlet.IDACall.handleDSRequest(IDACall.java:199)
    	at com.isomorphic.servlet.IDACall.processRPCTransaction(IDACall.java:156)
    	at com.isomorphic.servlet.IDACall.processRequest(IDACall.java:121)
    	at com.isomorphic.servlet.IDACall.doPost(IDACall.java:73)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	at com.isomorphic.servlet.BaseServlet.service(BaseServlet.java:152)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
    	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at org.mortbay.jetty.Server.handle(Server.java:324)
    	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
    	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
    	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
    Caused by: org.hibernate.exception.DataException: could not execute query
    	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:102)
    	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    	at org.hibernate.loader.Loader.doList(Loader.java:2536)
    	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
    	at org.hibernate.loader.Loader.list(Loader.java:2271)
    	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)
    	at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
    	at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
    	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
    	at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
    	at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:274)
    	... 32 more
    Caused by: java.sql.SQLException: Operand should contain 1 column(s)
    	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3597)
    	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3529)
    	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990)
    	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151)
    	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2625)
    	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119)
    	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2281)
    	at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
    	at org.hibernate.loader.Loader.getResultSet(Loader.java:1953)
    	at org.hibernate.loader.Loader.doQuery(Loader.java:802)
    	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    	at org.hibernate.loader.Loader.doList(Loader.java:2533)
    	... 40 more
    === 2011-08-30 23:56:07,415 [l0-4] WARN  RequestContext - dsRequest.execute() failed: 
    javax.persistence.PersistenceException: org.hibernate.exception.DataException: could not execute query
    	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1215)
    	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1148)
    	at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:307)
    	at org.hibernate.ejb.criteria.CriteriaQueryCompiler$3.getSingleResult(CriteriaQueryCompiler.java:264)
    	at com.isomorphic.jpa.JPA2DataSource.executeFetch(JPA2DataSource.java:304)
    	at com.isomorphic.datasource.DataSource.execute(DataSource.java:1154)
    	at com.isomorphic.jpa.JPADataSource.execute(JPADataSource.java:356)
    	at com.isomorphic.application.AppBase.executeDefaultDSOperation(AppBase.java:721)
    	at com.isomorphic.application.AppBase.executeAppOperation(AppBase.java:658)
    	at com.isomorphic.application.AppBase.execute(AppBase.java:491)
    	at com.isomorphic.datasource.DSRequest.execute(DSRequest.java:1714)
    	at com.isomorphic.servlet.IDACall.handleDSRequest(IDACall.java:199)
    	at com.isomorphic.servlet.IDACall.processRPCTransaction(IDACall.java:156)
    	at com.isomorphic.servlet.IDACall.processRequest(IDACall.java:121)
    	at com.isomorphic.servlet.IDACall.doPost(IDACall.java:73)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	at com.isomorphic.servlet.BaseServlet.service(BaseServlet.java:152)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
    	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at org.mortbay.jetty.Server.handle(Server.java:324)
    	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
    	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
    	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
    Caused by: org.hibernate.exception.DataException: could not execute query
    	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:102)
    	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    	at org.hibernate.loader.Loader.doList(Loader.java:2536)
    	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
    	at org.hibernate.loader.Loader.list(Loader.java:2271)
    	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)
    	at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
    	at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
    	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
    	at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
    	at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:274)
    	... 32 more
    Caused by: java.sql.SQLException: Operand should contain 1 column(s)
    	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3597)
    	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3529)
    	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990)
    	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151)
    	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2625)
    	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119)
    	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2281)
    	at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
    	at org.hibernate.loader.Loader.getResultSet(Loader.java:1953)
    	at org.hibernate.loader.Loader.doQuery(Loader.java:802)
    	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    	at org.hibernate.loader.Loader.doList(Loader.java:2533)
    	... 40 more
    === 2011-08-30 23:56:07,415 [l0-4] DEBUG RPCManager - Content type for RPC transaction: text/plain; charset=UTF-8
    === 2011-08-30 23:56:07,415 [l0-4] DEBUG JPADataSource - Rolling back current transaction.
    === 2011-08-30 23:56:07,417 [l0-4] DEBUG DataSource - In DS.forName() for 'orderItem' with DSRequest: com.isomorphic.datasource.DSRequest@3ce02577
    === 2011-08-30 23:56:07,417 [l0-4] DEBUG DataSource - Creating instance of DataSource 'orderItem'
    === 2011-08-30 23:56:07,417 [l0-4] DEBUG RPCManager - non-DMI response, dropExtraFields: false
    === 2011-08-30 23:56:07,418 [l0-4] DEBUG JPADataSource - Releasing entity manager.
    Ie JPA provider generate incorrect SQL statment:
    Code:
        select
            count((orderitem0_.item_id,
            orderitem0_.order_id)) as col_0_0_ 
        from
            orderItems orderitem0_ limit ?

    #2
    Hello!

    I'm having a similar issue described at this thread:
    http://forums.smartclient.com/showthread.php?p=98504&posted=1#post98504

    How did you managed to fix this problem?

    Thank you !

    Comment

    Working...
    X