hibernate一对多异常 ERROR: ORA-00904: "CITY0_"."AID": 标识符无效

今日遇到一个异常纠结很久,hibernate一对多查询问题,po类及配置文件、dao均检查数遍,没有问题。但是依旧报city.aid标示符无效。

po类:

public class Area {
private Integer aid;
private String aname;
private Set city = new HashSet();

public Integer getAid() {
return aid;
}
public void setAid(Integer aid) {
this.aid = aid;
}
public String getAname() {
return aname;
}
public void setAname(String aname) {
this.aname = aname;
}
public Set getCity() {
return city;
}
public void setCity(Set city) {
this.city = city;
}
}


public class City {
private Integer cid;
private String cname;

public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}

}


po映射文件:

<hibernate-mapping>
    <class name="po.Area" table="area" schema="SCOTT">
        <id name="aid" type="java.lang.Integer">
            <column name="aid" />
            <generator class="increment" />
        </id>
        <property name="aname" type="java.lang.String">
            <column name="aname" />
        </property>
        <set name="city" lazy="false" >
        <key column="aid" />
        <one-to-many class="po.City" />
        </set>
    </class>
</hibernate-mapping>


<hibernate-mapping>
    <class name="po.City" table="city" schema="SCOTT">
        <id name="cid" type="java.lang.Integer">
            <column name="cid" />
            <generator class="increment" />
        </id>
        <property name="cname" type="java.lang.String">
            <column name="cname" />
        </property>
    </class>
</hibernate-mapping>


dao:

public Area getArea(int aid){
//创建Session对象
Session session = HibernateSessionFactory.currentSession();
//调用get方法
Area area = (Area)session.get(Area.class, aid);

//查询关联的城市信息
Set set = area.getCity();
Iterator it = set.iterator();
while(it.hasNext()){
City city = (City)it.next();
city.getCname();
}
//关闭session
HibernateSessionFactory.closeSession();
return area;
}


oracle数据库表:

drop table area;
create table area(
   aid number(10),
   aname varchar2(20)
);
insert into area values(1,'山西');
insert into area values(2,'黑龙江');
select * from area;


drop table city;
create table city(
   cid number(10),
   cname varchar2(20),
   aid number(10)
);
insert into city values(50,'太原',1);
insert into city values(51,'忻州',1);
select * from city
;


异常信息:

2014-4-28 11:02:18 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
2014-4-28 11:02:18 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
2014-4-28 11:02:18 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
2014-4-28 11:02:18 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
2014-4-28 11:02:18 org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /config/hibernate.cfg.xml
2014-4-28 11:02:18 org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: /config/hibernate.cfg.xml
2014-4-28 11:02:18 org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity
WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
2014-4-28 11:02:18 org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: po/City.hbm.xml
2014-4-28 11:02:18 org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity
WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
2014-4-28 11:02:18 org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: po/Area.hbm.xml
2014-4-28 11:02:18 org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity
WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
2014-4-28 11:02:18 org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
2014-4-28 11:02:18 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
2014-4-28 11:02:18 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [oracle.jdbc.driver.OracleDriver] at URL [jdbc:oracle:thin:@localhost:1521:orcl]
2014-4-28 11:02:18 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=scott, password=****}
2014-4-28 11:02:18 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
2014-4-28 11:02:18 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
2014-4-28 11:02:18 org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.Oracle9Dialect
2014-4-28 11:02:18 org.hibernate.dialect.Oracle9Dialect <init>
WARN: HHH000063: The Oracle9Dialect dialect has been deprecated; use either Oracle9iDialect or Oracle10gDialect instead
2014-4-28 11:02:18 org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
2014-4-28 11:02:18 org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select area0_.aid as aid1_0_0_, area0_.aname as aname2_0_0_ from SCOTT.area area0_ where area0_.aid=?
Hibernate: select city0_.aid as aid3_0_0_, city0_.cid as cid1_1_0_, city0_.cid as cid1_1_1_, city0_.cname as cname2_1_1_ from SCOTT.city city0_ where city0_.aid=?
2014-4-28 11:02:19 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 904, SQLState: 42000
2014-4-28 11:02:19 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ORA-00904: "CITY0_"."AID": 标识符无效


2014-4-28 11:02:19 org.hibernate.event.internal.DefaultLoadEventListener onLoad
INFO: HHH000327: Error performing load command : org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:89)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.getResultSet(AbstractLoadPlanBasedLoader.java:449)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:202)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:137)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:102)
at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:100)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:693)
at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:92)
at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1897)
at org.hibernate.collection.internal.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:683)
at org.hibernate.engine.internal.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:890)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:164)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:102)
at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:186)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4126)
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:502)
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:467)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:212)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:274)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:150)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1070)
at org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:176)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2551)
at org.hibernate.internal.SessionImpl.get(SessionImpl.java:955)
at dao.AreaDAO.getArea(AreaDAO.java:24)
at service.Service.getArea(Service.java:21)
at test.Test.main(Test.java:14)
Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "CITY0_"."AID": 标识符无效


at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:91)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1030)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:785)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:860)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1186)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3381)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3425)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1490)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:80)
... 26 more


原因分析:

    在这里java代码和数据库表均没有异常,一再检查还是没有异常,为什么仍旧报city.aid标示符无效异常呢?

    作者在这里愚蠢的纠结了两天,期间更换hibernate类库,更换jdk版本,跟换jdbc驱动类。。。。。。。均未果。黄天不负有心人,终于在第二日无意中的一个操作找到了问题所在:原来是我的数据库表第一次建的有误,city表中没有aid字段,于是进行修改,当时由于出了另外一个问题,就切换到sysdba账号下进行的操作,而nomal scott账户下的表结构根本没有修改。。。(原来sysdba和nomal账户的表结构可以不一样。。)我在eclipse调试代码的时候,pl_sql一直在sysdba账户下检查表结构,于是我在认为表结构没有问题的前提下一再调错均未果。终于偶然间的发现,我在nomal账户中修改表结构后,异常解决。真是巨坑啊。。。这里抛出一个问题:jdbc为什么默认连接oracle的scott(nomal)账户而不是拥有最高权限的sysdba账户?作者百度无果,故求高人解答!


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值