hibernate

jiangdetian 2008-11-20 04:42:17
最近在做ssh项目的时候遇到的
应该是Hibernate出的问题,也可能是我的数据库里表建的有问题。
帮帮忙,谢谢大家啦!

报的错:

Hibernate: select messages0_.ID as ID2_, messages0_.AccountId as AccountId2_, messages0_.MessagesId as MessagesId2_, messages0_.time as time2_, messages0_.Title as Title2_, messages0_.Content as Content2_ from mbdata.dbo.Messages messages0_

Exception in thread "main" java.lang.NumberFormatException: For input string: "MIBO01"

at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.valueOf(Unknown Source)
at com.microsoft.sqlserver.jdbc.DDC.convertStringToObject(Unknown Source)
at com.microsoft.sqlserver.jdbc.ServerDTVImpl.getValue(Unknown Source)
at com.microsoft.sqlserver.jdbc.DTV.getInt(Unknown Source)
at com.microsoft.sqlserver.jdbc.Column.getInt(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getInt(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getInt(Unknown Source)
at org.hibernate.type.IntegerType.get(IntegerType.java:28)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:113)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:102)
at org.hibernate.type.ManyToOneType.hydrate(ManyToOneType.java:95)
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:1899)
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1372)
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1300)
at org.hibernate.loader.Loader.getRow(Loader.java:1197)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:569)
at org.hibernate.loader.Loader.doQuery(Loader.java:689)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at test.Test.main(Test.java:19)



数据库部分代码:

--账号
create table Account(
ID int identity(1,1) primary key,--用户编号
AccountId varchar(20) unique not null,
Name varchar(50) not null,--用户姓名
Password varchar(30) not null,--密码
Marker varchar(1) not null default 'C', --禁用标识(标识该账号为员工所有还在注册用户或企业所有)(值:M or C or S)M为本公司员工 C为个人S为企业
Check (Marker='C'or Marker='S'or Marker='M'),)

set identity_insert Account on,
insert into Account (ID,AccountId,Name,Password,Marker) values (1,'MIBO01','admin','admin','M')
set identity_insert Account off

--发帖
create table Messages(
ID int identity(1,1) primary key,
MessagesId varchar(20) unique not null,
AccountId varchar(20) not null,
[time] datetime not null,
Title varchar(50) not null ,
[Content] varchr(1000) not null default '如题',

constraint FK_Messages_Account foreign key (AccountId) references Account (AccountId),
)

set identity_insert Messages on,
insert into Messages(ID,MessagesId,AccountId,[Time],Title) values (1,'MESS01','MIBO01','2008-11-20','哇 出问题啦')
set identity_insert Messages off



Hibernate映射文件部分代码:

<class name="vo.Account" table="Account" schema="dbo" catalog="mbdata">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<set name="messageses" inverse="true">
<key >
<column name="AccountId" length="20" not-null="true" />
</key>
<one-to-many class="vo.Messages" />
</set>

<class name="vo.Messages" table="Messages" schema="dbo" catalog="mbdata">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<many-to-one name="account" class="vo.Account" fetch="select">
<column name="AccountId" length="20" not-null="true" />
</many-to-one>



程序代码:

System.out.println(HibernateSessionFactory.getSession().createQuery("from Messages").list().size());




贴到这里呵呵 有点郁闷!
我在想为什么 总要去 For input string ,是不是我的数据库设计的有问题呀? MessageId 必须关联到Account的主键
要不是数据库有问题 那就是Hibernate不支持这种关联关系。要是能这样配 这样关联但我又不知道怎么配。郁闷

谢谢大家,帮忙解决解决咯!
...全文
117 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangdetian 2008-11-21
  • 打赏
  • 举报
回复
9楼的 我代码只有一行。怎么追呀。你说的是追hibernate源码吗?我也想不知道能不能追。你那有源码。发我一份谢谢咯
DeT.Jiang@gmail.com
jiangdetian 2008-11-21
  • 打赏
  • 举报
回复
今天我又做了
把数据库表的结构更改了
create table Account(

AccountId varchar(20) primary key,
Name varchar(50) not null,--用户姓名
Password varchar(30) not null,--密码
Marker varchar(1) not null default 'C', --禁用标识(标识该账号为员工所有还在注册用户或企业所有)(值:M or C or S)M为本公司员工 C为个人S为企业
Check (Marker='C'or Marker='S'or Marker='M'),)

create table Messages(

MessagesId varchar(20) primary key,
AccountId varchar(20) not null,
[time] datetime not null,
Title varchar(50) not null ,
[Content] varchar(1000) not null default '如题',

constraint FK_Messages_Account foreign key (AccountId) references Account (AccountId),
)

直接用varchar(20) ID作为主键省去 自动增长的int型 ID

这样再去做相同的动作没有报错。

通过这两次的比较可以肯定配置文件(Account.hbm.xml)中 元素<set> 的子元素<key>中的<column>元素中配置的是另一个表(Messages)的外键,而与这个外键(MessagesId)关联的一定是配置文件(Account.hbm.xml)相对应的表的主键,也就是Account表中的AccountId。

而在第一次就是昨天的例子中Account表中的AccountId不是作为主键存在的,它只是unique而非主键。可能hibernate默认的就把与外键对应的字段看成主键,才把从Messages检索出来的数据中的AccountId转型成Account表的主键(ID),这样肯定会报错lo。

如果我这样讲的没错的话,想问一句 与外键对应的一定是主键吗,数据库可以这样设计吧?
呵呵,估计我的数据库设计的不足。
那么hibernate。
jiangdetian 2008-11-21
  • 打赏
  • 举报
回复
今天我又做了
把数据库表的结构更改了
create table Account(

AccountId varchar(20) primary key,
Name varchar(50) not null,--用户姓名
Password varchar(30) not null,--密码
Marker varchar(1) not null default 'C', --禁用标识(标识该账号为员工所有还在注册用户或企业所有)(值:M or C or S)M为本公司员工 C为个人S为企业
Check (Marker='C'or Marker='S'or Marker='M'),)

create table Messages(

MessagesId varchar(20) primary key,
AccountId varchar(20) not null,
[time] datetime not null,
Title varchar(50) not null ,
[Content] varchar(1000) not null default '如题',

constraint FK_Messages_Account foreign key (AccountId) references Account (AccountId),
)

直接用varchar(20) ID作为主键省去 自动增长的int型 ID

这样再去做相同的动作没有报错。

通过这两次的比较可以肯定配置文件(Account.hbm.xml)中 元素<set> 的子元素<key>中的<column>元素中配置的是另一个表(Messages)的外键,而与这个外键(MessagesId)关联的一定是配置文件(Account.hbm.xml)相对应的表的主键,也就是Account表中的AccountId。

而在第一次就是昨天的例子中Account表中的AccountId不是作为主键存在的,它只是unique而非主键。可能hibernate默认的就把与外键对应的字段看成主键,才把从Messages检索出来的数据中的AccountId转型成Account表的主键(ID),这样肯定会报错lo。

如果我这样讲的没错的话,想问一句 与外键对应的一定是主键吗,数据库可以这样设计吧?
呵呵,估计我的数据库设计的不足。
那么hibernate。
DiscussQuestions 2008-11-21
  • 打赏
  • 举报
回复
我晕!~不好意思哈!~刚才的网络有一点卡!~!
不是故意的
DiscussQuestions 2008-11-21
  • 打赏
  • 举报
回复
这个问题很容易解决的!~!
Exception in thread "main" java.lang.NumberFormatException: For input string: "MIBO01"
你的这个异常只要找到哪儿有转换的的就可以了!~
或者用断点追踪一下!~!
楼主试试吧1~!比在CSDN里面解决的快啊
DiscussQuestions 2008-11-21
  • 打赏
  • 举报
回复
这个问题很容易解决的!~!
Exception in thread "main" java.lang.NumberFormatException: For input string: "MIBO01"
你的这个异常只要找到哪儿有转换的的就可以了!~
或者用断点追踪一下!~!
楼主试试吧1~!比在CSDN里面解决的快啊
DiscussQuestions 2008-11-21
  • 打赏
  • 举报
回复
这个问题很容易解决的!~!
Exception in thread "main" java.lang.NumberFormatException: For input string: "MIBO01"
你的这个异常只要找到哪儿有转换的的就可以了!~
或者用断点追踪一下!~!
楼主试试吧1~!比在CSDN里面解决的快啊
  • 打赏
  • 举报
回复
jiangdetian 2008-11-21
  • 打赏
  • 举报
回复
<set>不必再对应table了,
  • 打赏
  • 举报
回复
兄弟,错误信息已经说的很清楚了:
Exception in thread "main" java.lang.NumberFormatException: For input string: "MIBO01"


at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.valueOf(Unknown Source)


是格式转化错误,你仔细检查一下!
关注ing!
大海之粟 2008-11-20
  • 打赏
  • 举报
回复
从出错的异常可知,java.lang.NumberFormatException: For input string: "MIBO01"
MIBO01它不是数字,不能转换成数字型.
phoenixLotus 2008-11-20
  • 打赏
  • 举报
回复
调试下是哪点出的问题也 一个NumberFormatException应该不是难事!
jxhjyh123 2008-11-20
  • 打赏
  • 举报
回复
<set name="messageses" inverse="true">
<key >
<column name="AccountId" length="20" not-null="true" />
</key>
<one-to-many class="vo.Messages" />
</set>
在set里面好像是少了个东西吧。。set集合具体对应到哪张表。<set name="messageses" table="" inverse="true">

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧