I have an object "History" than insures that an enclosed list in the valid order and add some functionality. I am trying to map this object as a component which contains a bag. I am getting this bizarre error "Unknown column 'itemlist0_.elt' in 'field list'".
LOG
----
Code:
Hibernate: select this_.id as id2_0_, this_.username as username2_0_, this_.password as password2_0_, this_.account_type as account4_2_0_ from account this_ where this_.username=? and this_.password=?
Hibernate: select portfoliol0_.account_id as account4_1_, portfoliol0_.id as id1_, portfoliol0_.id as id0_0_, portfoliol0_.cash_transaction_last_update as cash2_0_0_, portfoliol0_.name as name0_0_, portfoliol0_.account_id as account4_0_0_ from portfolio portfoliol0_ where portfoliol0_.account_id=?
Hibernate: select itemlist0_.portfolio_id as portfolio4_0_, itemlist0_.elt as elt0_ from cash_transaction itemlist0_ where itemlist0_.portfolio_id=? order by date asc
15:08:08,530 WARN JDBCExceptionReporter:100 - SQL Error: 1054, SQLState: 42S22
15:08:08,566 ERROR JDBCExceptionReporter:101 - Unknown column 'itemlist0_.elt' in 'field list'
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract boolean ca.mcgill.learning.client.remoting.EISService.login(java.lang.String,java.lang.String)' threw an unexpected exception: org.hibernate.exception.SQLGrammarException: could not initialize a collection: [ca.mcgill.learning.client.object.Portfolio.cashTransactionHistory.itemList#1]
at com.google.gwt.user.server.rpc.RPCCopy_GWT15.encodeResponseForFailure(RPCCopy_GWT15.java:348)
at com.google.gwt.user.server.rpc.RPCCopy.encodeResponseForFailure(RPCCopy.java:212)
at ca.mcgill.learning.server.remoting.mod.ModifiedPersistentRemoteService.processCall(ModifiedPersistentRemoteService.java:72)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at com.google.gwt.dev.shell.GWTShellServlet.service(GWTShellServlet.java:289)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Unknown Source)
Caused by: org.hibernate.exception.SQLGrammarException: could not initialize a collection: [ca.mcgill.learning.client.object.Portfolio.cashTransactionHistory.itemList#1]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.loadCollection(Loader.java:2022)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:59)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:587)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:83)
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1743)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:366)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108)
at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:272)
at ca.mcgill.learning.server.EISServiceImpl.login(EISServiceImpl.java:176)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.user.server.rpc.RPCCopy_GWT15.invoke(RPCCopy_GWT15.java:563)
at com.google.gwt.user.server.rpc.RPCCopy.invoke(RPCCopy.java:163)
at ca.mcgill.learning.server.remoting.mod.ModifiedPersistentRemoteService.invokeMethod(ModifiedPersistentRemoteService.java:97)
at ca.mcgill.learning.server.EISServiceImpl.invokeMethod(EISServiceImpl.java:95)
at ca.mcgill.learning.server.remoting.mod.ModifiedPersistentRemoteService.processCall(ModifiedPersistentRemoteService.java:58)
... 29 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'itemlist0_.elt' in 'field list'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3515)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2554)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1761)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1912)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1808)
at org.hibernate.loader.Loader.doQuery(Loader.java:697)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.loadCollection(Loader.java:2015)
... 46 more
PORTFOLIO MAPPING
-------------------
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="ca.mcgill.learning.client.object">
<class name="Portfolio" table="portfolio">
<id name="id">
<generator class="native"/>
</id>
<component name="cashTransactionHistory" class="History">
<property name="lastUpdate" column="cash_transaction_last_update"/>
<bag name="itemList" table="cash_transaction" order-by="date asc">
<key column="portfolio_id"/>
<element type="ca.mcgill.learning.client.object.CashTransaction"/>
</bag>
</component>
<property name="name"/>
<many-to-one name="ownerAccount" column="account_id"/>
</class>
</hibernate-mapping>
TABLES
---------
CREATE TABLE `portfolio` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`account_id` bigint(20) NOT NULL,
`portfolio_group_id` bigint(20) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`cash_transaction_last_update` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
******
CREATE TABLE `cash_transaction` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`portfolio_id` bigint(20) NOT NULL,
`date` datetime DEFAULT NULL,
`value` double NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
*********
PORTFOLIO CLASS
----------------
Code:
package ca.mcgill.learning.client.object;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Portfolio implements Serializable, Identifiable {
/**
*
*/
private static final long serialVersionUID = 1L;
private History<Transaction> transactionHistory = new History<Transaction>();
private History<CashTransaction> cashTransactionHistory = new History<CashTransaction>();
private Map<Security, History<Transaction>> securityTransactionMap = new HashMap<Security, History<Transaction>>();
private String name = "";
private Account ownerAccount;
//TODO Transient???
private transient InterestRateProvider interestRateProvider;
private Map<Security, SecurityPosition> securityPositions = new HashMap<Security, SecurityPosition>();
private PortfolioGroup portfolioGroup = null;
private PortfolioRules portfolioRules = new PortfolioRules();
private PortfolioPosition portfolioPosition = null;
private Long id;
public Long getId() {
return id;
}
protected void setId(Long id) {
this.id = id;
}
public Account getOwnerAccount() {
return ownerAccount;
}
public void setOwnerAccount(Account ownerAccount) {
this.ownerAccount = ownerAccount;
}
public synchronized void addTransation(Transaction transaction) {
Security security = transaction.getSecurity();
if(!transactionHistory.contains(transaction) && transaction.getSecurity()!=null) {
transactionHistory.addItem(transaction);
History<Transaction> securityTransactionHistory = securityTransactionMap.get(security);
if(securityTransactionHistory == null) {
securityTransactionHistory = new History<Transaction>();
securityTransactionMap.put(security, securityTransactionHistory);
}
securityTransactionHistory.addItem(transaction);
}
}
public synchronized History<Transaction> getTransactions(Security security) {
History<Transaction> transactionHist = securityTransactionMap.get(security);
if(transactionHist == null) {
transactionHist = new History<Transaction>();
}
return transactionHist;
}
public synchronized History<Transaction> getTransactions() {
return transactionHistory;
}
public synchronized List<Security> getSecurities() {
return new ArrayList<Security>(securityTransactionMap.keySet());
}
public InterestRateProvider getInterestRateProvider() {
return interestRateProvider;
}
public void setInterestRateProvider(InterestRateProvider interestRateProvider) {
this.interestRateProvider = interestRateProvider;
}
public synchronized void setSecurityPosition(Security security, SecurityPosition securityPosition) {
SecurityPosition registeredSecurityPosition = securityPositions.get(security);
if(registeredSecurityPosition == null || !registeredSecurityPosition.getDate().after(securityPosition.getDate())) {
securityPositions.put(security, securityPosition);
}
}
public synchronized SecurityPosition getSecurityPosition(Security security) {
return securityPositions.get(security);
}
public synchronized List<SecurityPosition> getSecurityPositionList() {
return new ArrayList<SecurityPosition>(securityPositions.values());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public PortfolioRules getPortfolioRules() {
return portfolioRules;
}
public void setPortfolioRules(PortfolioRules portfolioRules) {
this.portfolioRules = portfolioRules;
}
public PortfolioGroup getPortfolioGroup() {
return portfolioGroup;
}
public void setPortfolioGroup(PortfolioGroup portfolioGroup) {
this.portfolioGroup = portfolioGroup;
}
public synchronized History<CashTransaction> getCashTransactionHistory() {
return cashTransactionHistory;
}
public void setCashTransactionHistory(
History<CashTransaction> cashTransactionHistory) {
this.cashTransactionHistory = cashTransactionHistory;
}
public PortfolioPosition getPortfolioPosition() {
return portfolioPosition;
}
public void setPortfolioPosition(PortfolioPosition portfolioPosition) {
this.portfolioPosition = portfolioPosition;
}
}
HISTORY CLASS
---------------
Code:
package ca.mcgill.learning.client.object;
import ca.mcgill.learning.client.ClientUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class History<T extends ITimeStamped> implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private List<T> itemList;
private boolean dailyLimit;
private Date lastUpdate;
public History() {
this(false);
}
public History(boolean dailyLimit) {
this.dailyLimit = dailyLimit;
itemList = new SynchronousArrayList<T>();
}
public synchronized void clear() {
itemList.clear();
}
public synchronized boolean contains(T item) {
return itemList.contains(item);
}
public synchronized boolean isEmpty() {
return itemList.isEmpty();
}
public synchronized int size() {
return itemList.size();
}
public synchronized T getLast() {
if(itemList.size()>0) {
return itemList.get(itemList.size() - 1);
}
return null;
}
public synchronized T getFirst() {
if(itemList.size()>0) {
return itemList.get(0);
}
return null;
}
private void checkTimeLimit() {
if(dailyLimit) {
Date startOfTheDayDate = ClientUtils.getStartOfTheDay();
T lastItem = getLast();
if(lastItem != null) {
if(lastItem.getDate().before(startOfTheDayDate)) {
clear();
}
}
}
}
public synchronized void addItem(T item) {
checkTimeLimit();
T lastItem = getLast();
if(lastItem == null) {
itemList.add(item);
}else if(lastItem.getDate().compareTo(item.getDate())<0) {
itemList.add(item);
}else {
for(int i = itemList.size()-1; i>=0; i--) {
int compare = itemList.get(i).getDate().compareTo(item.getDate());
if(compare < 0 ) {
itemList.add(i+1, item); // should always work (i+1)
break;
}else if(compare == 0) {
itemList.set(i, item); // replace existing
break;
}else if(i==0) {
itemList.add(0, item);
break;
}
}
}
setLastUpdate(item.getDate());
}
// since history can only be increased
// TODO this is bad should change it
public synchronized List<T> getItemList() {
// return new ArrayList<T>(itemList); //copy to keep synchronized
return itemList;
}
protected synchronized void setItemList(List<T> itemList) {
this.itemList = itemList;
}
public synchronized T getItem(Date date) {
T item = null;
int ind = itemList.indexOf(date);
if(ind != -1) {
item = itemList.get(ind);
}
return item;
}
public synchronized void setLastUpdate(Date lastUpdate) {
if(this.lastUpdate == null || lastUpdate.after(this.lastUpdate)) {
this.lastUpdate = lastUpdate;
}
}
public synchronized Date getLastUpdate() {
return lastUpdate;
}
/**
* Inclusive on both sides
* @param fromDate
* @param toDate
* @return
*/
public synchronized List<T> getRange(Date fromDate, Date toDate) {
List<T> list = new ArrayList<T>();
if (!isEmpty()) {
for(int i=itemList.size()-1; i>=0; i--) {
T item = itemList.get(i);
Date itemDate = item.getDate();
if(toDate==null || !itemDate.after(toDate)) {
if(fromDate==null || !itemDate.before(fromDate)) {
list.add(item);
}else if(fromDate != null){ //over the from Date: Done
break;
}
}
}
}
return list;
}
}
CASHTRANSACTION CLASS
-------------------------
Code:
package ca.mcgill.learning.client.object;
import java.io.Serializable;
import java.util.Date;
public class CashTransaction implements Serializable, ITimeStamped<CashTransaction>, Identifiable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Portfolio portfolio;
private double value; // negative for withdrawals, positive for deposits
private Date date = new Date();
private Long id;
public Long getId() {
return id;
}
protected void setId(Long id) {
this.id = id;
}
public Portfolio getPortfolio() {
return portfolio;
}
public void setPortfolio(Portfolio portfolio) {
this.portfolio = portfolio;
}
public double getValue() {
return value;
}
public void setValue(double value) {
this.value = value;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public int compareTo(CashTransaction cashTransaction) {
return date.compareTo(cashTransaction.date);
}
@Override
public String toString() {
return "Cash Transaction '" + (id!=null?id:"") + ": value = " + value + "@ " + date;
}
}
CASH TRANSACTION MAPPING
--------------------------------
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="ca.mcgill.learning.client.object">
<class name="CashTransaction" table="cash_transaction">
<id name="id">
<generator class="native"/>
</id>
<property name="value"/>
<property name="date"/>
<many-to-one name="portfolio" lazy="proxy" column="portfolio_id"/>
</class>
</hibernate-mapping>