DAO:
public void add(Order c) {
System.out.println(c.getOrdeID()); //有值输出
this.hibernateTemplate.save(c);
}
SQL:
create table _Order(
OrdeID char(12) primary key not null,
ProductCode char(12) not null,
Quantity int not null,
BusinessName varchar(1000) null
)
出现下面问题:
Hibernate: insert into _Order (businessName, productCode, quantity) values (?, ?, ?)
11:27:37,093 WARN org.hibernate.util.JDBCExceptionReporter:100 - SQL Error: 515, SQLState: 23000
11:27:37,109 ERROR org.hibernate.util.JDBCExceptionReporter:101 - 不能将值 NULL 插入列 'OrdeID',表 'MES.dbo._Order';列不允许有空值。INSERT 失败。
[quote]是吧
@Id
@GeneratedValue 删了吗? [/quote]
@GeneratedValue删了试试,只留@Id应该就ok了。
不行的话@GenerateValue()里应该还有参数的,记得是generatedType什么的,是个枚举类型,里面应该有不生成策略的。
你的orderId在Bean里面是怎么定义的,是否违反了JavaBean规约?
orderId???
orderID???
要定义成orderId
[quote]
private String OrdeID;
private String ProductCode;
private int Quantity;
private String BusinessName;
[/quote]
这些有问题,要以小写开头,驼峰式命名,不要出现连续2个大写的。
get/set方法嘛,让eclipse重新自动生成一遍吧
[quote]private String ordeID; [/quote]
要改成orderId
Shift+Alt+s 然后 Ctrl+r 可以出现选择生成get/set方法的窗口
自己手写get/set难免会出现错误 保证了规范 在去解决其它的
ordeID是主键,但是你既没有配置主键的生成策略,又没有设置主键的值,当然插入不成功的。
解决方案有几种:
1.配置主键生成策略,这个记不太清了,记得可以是让数据库自己生成,也可以委托hibernate生成,具体情况最好看下官方文档;
2.自己做个ID系统来生成主键,可以是一个方法,也可以是一台远程服务器,这个要看具体需求。
[quote]ordeID是主键,但是你既没有配置主键的生成策略,又没有设置主键的值,当然插入不成功的。
解决方案有几种:
1.配置主键生成策略,这个记不太清了,记得可以是让数据库自己生成,也可以委托hibernate生成,具体情况最好看下官方文档;
2.自己做个ID系统来生成主键,可以是一个方法,也可以是一台远程服务器,这个要看具体需求。[/quote]
……
没看仔细,原来是有ID的,那就有可能是mapping配置的问题了。
[quote]……
没看仔细,原来是有ID的,那就有可能是mapping配置的问题了。[/quote]
根据分析,hibernate mapping配置的问题可能出在这里:
看控制台异常输出,OrderID根本没有加到insert语句里去,很可能是你把主键生成策略设置成数据库自动生成了,那么hibernate生成insert SQL语句时是不会传入主键的,要把生成策略删掉。