Hibernate的主键生成方式generator产生问题,ids for this class must be man或could not get next sequence value

EternalFaith 2009-03-24 08:26:54
hbm.xml文件如下

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="XXX.XML.vo.Newtracking" table="newtracking" schema="SCOTT">
<id name="jobid" type="java.lang.String">
<column name="JOBID" length="16" />
<generator class="assigned">
</generator>
</id>
<property name="jobname" type="java.lang.String">
<column name="JOBNAME" length="20" not-null="true" />
</property>
<property name="zipfilename" type="java.lang.String">
<column name="ZIPFILENAME" length="64" not-null="false" />
</property>
<property name="newhodate" type="java.lang.String">
<column name="NEWHODATE" length="32" not-null="true" />
</property>
<property name="newhbdate" type="java.lang.String">
<column name="NEWHBDATE" length="32" not-null="true" />
</property>
<property name="jobstatus" type="java.lang.String">
<column name="JOBSTATUS" length="16" not-null="false" />
</property>
<property name="csvendor" type="java.lang.String">
<column name="CSVENDOR" length="32" not-null="false" />
</property>
<property name="ctvendor" type="java.lang.String">
<column name="CTVENDOR" length="32" not-null="false" />
</property>
<property name="kovendor" type="java.lang.String">
<column name="KOVENDOR" length="32" not-null="false" />
</property>
<property name="javendor" type="java.lang.String">
<column name="JAVENDOR" length="32" not-null="false" />
</property>
<property name="idvendor" type="java.lang.String">
<column name="IDVENDOR" length="32" not-null="false" />
</property>
<property name="thvendor" type="java.lang.String">
<column name="THVENDOR" length="32" not-null="false" />
</property>
<property name="vivendor" type="java.lang.String">
<column name="VIVENDOR" length="32" not-null="false" />
</property>
<property name="filvendor" type="java.lang.String">
<column name="FILVENDOR" length="32" not-null="false" />
</property>
<property name="product" type="java.lang.String">
<column name="PRODUCT" length="32" not-null="true" />
</property>
<property name="wordcount" type="java.lang.String">
<column name="WORDCOUNT" length="32" not-null="true" />
</property>
<property name="dgrade" type="java.lang.String">
<column name="DGRADE" length="32" not-null="true" />
</property>
<property name="gpm" type="java.lang.String">
<column name="GPM" length="32" not-null="false" />
</property>
<property name="xmlpath" type="java.lang.String">
<column name="XMLPATH" length="128" not-null="true" />
</property>
</class>
</hibernate-mapping>

写VO的类
package XXX.ImportXML.impl;

import java.util.*;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import XXX.ImportXML.dao.ImportXMLDAO;
import XXX.ImportXML.factory.ImportXMLSessionFactory;
import XXX.XML.GetInfoXML;
import XXX.XML.vo.Newtracking;

public class ImportXMLIpml implements ImportXMLDAO {
private Session session;
public ImportXMLIpml()
{
this.session = ImportXMLSessionFactory.getSession() ;
}
public boolean isImport(Newtracking newtracking) {
boolean flag = false;
Transaction tx = session.beginTransaction();
try {
String xmlpath = newtracking.getXmlpath();
GetInfoXML getinfoxml = new GetInfoXML();
Map language = getinfoxml.getInfoXML(xmlpath);
Map info = (Map)language.get("info");
Map LL = (Map)language.get("LC");
//System.out.print(LL);
//System.out.print((String)LL.get("ko"));
//String a = (String)LL.get("zh-TW");
//System.out.print(a);
newtracking.setDgrade((String)info.get("TranslationPriority"));
newtracking.setNewhodate((String)info.get("TranslationDate"));
newtracking.setNewhbdate((String)info.get("ValidationDate"));
newtracking.setJobid((String)info.get("jobid"));
newtracking.setProduct((String)info.get("Product"));
newtracking.setWordcount((String)info.get("WordCount"));
while ("fil".equals(LL.get("fil"))) {
newtracking.setFilvendor("Estrada Jake Irwin");
break;
}
while ("id".equals(LL.get("id"))) {
newtracking.setIdvendor("Bahasa Bagoes");
break;
}
while ("in".equals(LL.get("in"))) {
newtracking.setIdvendor("Bahasa Bagoes");
break;
}
while ("ja".equals(LL.get("ja"))) {
newtracking.setJavendor("Tracom");
break;
}
while ("ko".equals(LL.get("ko"))) {
newtracking.setKovendor("LBT KO");
break;
}
while ("ms".equals(LL.get("ms"))) {
newtracking.setMsvendor("Sophia Jusoff");
break;
}
while ("th".equals(LL.get("th"))) {
newtracking.setThvendor("LBT TH");
break;
}
while ("vi".equals(LL.get("vi"))) {
newtracking.setVivendor("Vincent");
break;
}
while ("zh-CN".equals(LL.get("zh-CN"))) {
newtracking.setCsvendor("Inhouse");
break;
}
while ("zh-TW".equals(LL.get("zh-TW"))) {
newtracking.setCtvendor("LBT TW");
break;
}
while ("zh-HK".equals(LL.get("zh-HK"))) {
newtracking.setCkvendor("LBT HK");
break;
}
session.save(newtracking);
tx.commit();
flag = true;
}
catch (HibernateException e) {
e.printStackTrace();
tx.rollback();
flag = false;
}
finally {
this.session.close();
}
return flag;
}
}
数据库创建脚本

DROP TABLE NewTracking ;

CREATE TABLE NewTracking
(
jobid varchar(16) not null primary key ,
jobname varchar(128) not null ,
zipfilename varchar(128) ,
newhodate varchar(32) not null ,
newhbdate varchar(32) not null ,
jobstatus varchar(16) ,
csvendor varchar(32) ,
ctvendor varchar(32) ,
ckvendor varchar(32) ,
kovendor varchar(32) ,
javendor varchar(32) ,
idvendor varchar(32) ,
thvendor varchar(32) ,
vivendor varchar(32) ,
filvendor varchar(32) ,
msvendor varchar(32) ,
product varchar(32) not null ,
wordcount varchar(32) not null ,
dgrade varchar(32) not null ,
gpm varchar(32) ,
xmlpath varchar(128) not null
) ;

commit ;

用hbm.xml中用assigned的话,会TomCat会报ids for this class must be man
ually assigned before calling save(),如果换用sequence,又会could not get next sequence value,用native也不行,是不是需要在oracle中建一个sequence生成方式,我不太懂,哪位XD指教一下
...全文
801 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsut_play_2 2011-07-21
  • 打赏
  • 举报
回复
adsfdsafffffffff
EternalFaith 2009-03-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhj92lxs 的回复:]
jobname 这个配置文件里要求不为空,但你的程序里没有给他赋值
[/Quote]
这丢人事又让XD发现了,太不仔细了...多谢
zhj92lxs 2009-03-24
  • 打赏
  • 举报
回复
jobname 这个配置文件里要求不为空,但你的程序里没有给他赋值
EternalFaith 2009-03-24
  • 打赏
  • 举报
回复
我创建了序列,然后又出现如下问题
Hibernate: select jobid_seq.nextval from dual
org.hibernate.PropertyValueException: not-null property references a null or tra
nsient value: XXX.XML.vo.Newtracking.jobname
at org.hibernate.engine.Nullability.checkNullability(Nullability.java:72
)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplic
ate(AbstractSaveEventListener.java:265)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(Abstrac
tSaveEventListener.java:167)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId
(AbstractSaveEventListener.java:114)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGene
ratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrR
equestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTran
sient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(
DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpda
te(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:530)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:518)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:514)
at XXX.ImportXML.impl.ImportXMLIpml.isImport(ImportXMLIpml.jav
a:84)
at cn.XXX.struts.action.ImportXMLAction.execute(ImportXMLActio
n.java:48)
at org.apache.struts.action.RequestProcessor.processActionPerform(Reques
tProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.ja
va:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:119
4)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
alve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
alve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
ava:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
ava:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
ve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav
a:286)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcesso
r.java:857)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.pr
ocess(Http11AprProtocol.java:565)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:15
09)
at java.lang.Thread.run(Unknown Source)

是不是因为我有些property是null呢?这正是我的需求,如果property没有值,就把null set进去,这个需求需要我另外实现一下吧?这是不是引起上述问题的原因呢?
秦Eric 2009-03-24
  • 打赏
  • 举报
回复
如果要用序列的话在oracle中创建一个在用
create sequence sid_01
increment by 1
start with 1
nomaxvalue
nocycle
cache 10;
配置代码:
<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0" />
<generator class="native">
<param name="sequence">sid_01</param>
</generator>
</id>

67,538

社区成员

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

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