Hibernate的一个小问题

时间:2022-07-14 17:34:14
实在检查不出来是哪里错了....
就是对象有一个属性是集合,我想把这个对象放到数据库里。

user2.java
package pojo;

import java.util.ArrayList;
import java.util.List;

public class User2
{
int id;
List<String> nickName = new ArrayList<String>();
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public List<String> getNickName()
{
return nickName;
}
public void setNickName(List<String> nickName)
{
this.nickName = nickName;
}

}



User2.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="pojo">
<class name="User2" table="User2">
<id name="id">
<generator class="native"/>
</id>
<list name="nickName" table="nickName">
<key column="id" not-null="true"></key>
<list-index column="list-index"></list-index>
<element type="string" column="nick-name"></element>
</list>
</class>
</hibernate-mapping>

hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<property name="show_sql">true</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/test</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="hbm2ddl.auto">update</property>
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<mapping resource="pojo/User2.hbm.xml"/>
</session-factory>
</hibernate-configuration>

main
package pojo;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Test
{
 public static void main(String[] args)
{
Configuration conf = new Configuration().configure();
SessionFactory f = conf.buildSessionFactory();
Session s = f.openSession();
Transaction t = s.beginTransaction();

User2 u = new User2();
u.setId(9);
List<String> list = new ArrayList<String>();
list.add("Jet");
list.add("hehe");
u.setNickName(list);

s.save(u);
t.commit();
s.close();
f.close();

}
}





提示错误是
ERROR: HHH000388: Unsuccessful: create table nickName (id integer not null, nick-name varchar(255), list-index integer not null, primary key (id, list-index)) type=InnoDB
三月 26, 2014 8:41:58 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-name varchar(255), list-index integer not null, primary key (id, list-index)) t' at line 1
三月 26, 2014 8:41:58 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
ERROR: HHH000388: Unsuccessful: alter table nickName add constraint FK_5w1rlaf9gxhfepkgccwij41mp foreign key (id) references User2 (id)
三月 26, 2014 8:41:58 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
ERROR: Table 'test.nickname' doesn't exist
三月 26, 2014 8:41:58 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000232: Schema update complete
Hibernate: insert into User2 values ( )
三月 26, 2014 8:41:58 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1364, SQLState: HY000
三月 26, 2014 8:41:58 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Field 'id' doesn't have a default value
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not execute statement



谢谢!

9 个解决方案

#1


<class name="User2" table="User2">
class里面的name是全路径名字。

#2


引用 1 楼 zhangxiaojie0321 的回复:
<class name="User2" table="User2">
class里面的name是全路径名字。

<hibernate-mapping package="pojo">
已经写了package....

#3


引用 2 楼 abcwt112 的回复:
Quote: 引用 1 楼 zhangxiaojie0321 的回复:

<class name="User2" table="User2">
class里面的name是全路径名字。

<hibernate-mapping package="pojo">
已经写了package....

额。。你用的什么数据库呢? 

#4


引用 3 楼 zhangxiaojie0321 的回复:
Quote: 引用 2 楼 abcwt112 的回复:

Quote: 引用 1 楼 zhangxiaojie0321 的回复:

<class name="User2" table="User2">
class里面的name是全路径名字。

<hibernate-mapping package="pojo">
已经写了package....

额。。你用的什么数据库呢? 

mysql 肯定连的上的.....

#5


引用 3 楼 zhangxiaojie0321 的回复:
Quote: 引用 2 楼 abcwt112 的回复:

Quote: 引用 1 楼 zhangxiaojie0321 的回复:

<class name="User2" table="User2">
class里面的name是全路径名字。

<hibernate-mapping package="pojo">
已经写了package....

额。。你用的什么数据库呢? 

如果一个表没有建立的话....<property name="hbm2ddl.auto">update</property>.....是可以自动新建的把?!

#6


引用 5 楼 abcwt112 的回复:
Quote: 引用 3 楼 zhangxiaojie0321 的回复:

Quote: 引用 2 楼 abcwt112 的回复:

Quote: 引用 1 楼 zhangxiaojie0321 的回复:

<class name="User2" table="User2">
class里面的name是全路径名字。

<hibernate-mapping package="pojo">
已经写了package....

额。。你用的什么数据库呢? 

如果一个表没有建立的话....<property name="hbm2ddl.auto">update</property>.....是可以自动新建的把?!

是的。自动更新数据库结构

#7


引用 6 楼 zhangxiaojie0321 的回复:
Quote: 引用 5 楼 abcwt112 的回复:

Quote: 引用 3 楼 zhangxiaojie0321 的回复:

Quote: 引用 2 楼 abcwt112 的回复:

Quote: 引用 1 楼 zhangxiaojie0321 的回复:

<class name="User2" table="User2">
class里面的name是全路径名字。

<hibernate-mapping package="pojo">
已经写了package....

额。。你用的什么数据库呢? 

如果一个表没有建立的话....<property name="hbm2ddl.auto">update</property>.....是可以自动新建的把?!

是的。自动更新数据库结构

那还能有啥错误..................坑爹了.................... Hibernate的一个小问题

#8


噢!!!找到错误了....列名不能用-这个符号 Hibernate的一个小问题

#9


因为你的Oracle用户是DBA权限,和相应权限下其它表冲突了。
在hibernate配置中,增加别名配置:
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop><!-- validate  create  create-drop  update  -->
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.default_schema">ssh</prop>
====最后一句
<prop key="hibernate.default_schema">ssh</prop>

#1


<class name="User2" table="User2">
class里面的name是全路径名字。

#2


引用 1 楼 zhangxiaojie0321 的回复:
<class name="User2" table="User2">
class里面的name是全路径名字。

<hibernate-mapping package="pojo">
已经写了package....

#3


引用 2 楼 abcwt112 的回复:
Quote: 引用 1 楼 zhangxiaojie0321 的回复:

<class name="User2" table="User2">
class里面的name是全路径名字。

<hibernate-mapping package="pojo">
已经写了package....

额。。你用的什么数据库呢? 

#4


引用 3 楼 zhangxiaojie0321 的回复:
Quote: 引用 2 楼 abcwt112 的回复:

Quote: 引用 1 楼 zhangxiaojie0321 的回复:

<class name="User2" table="User2">
class里面的name是全路径名字。

<hibernate-mapping package="pojo">
已经写了package....

额。。你用的什么数据库呢? 

mysql 肯定连的上的.....

#5


引用 3 楼 zhangxiaojie0321 的回复:
Quote: 引用 2 楼 abcwt112 的回复:

Quote: 引用 1 楼 zhangxiaojie0321 的回复:

<class name="User2" table="User2">
class里面的name是全路径名字。

<hibernate-mapping package="pojo">
已经写了package....

额。。你用的什么数据库呢? 

如果一个表没有建立的话....<property name="hbm2ddl.auto">update</property>.....是可以自动新建的把?!

#6


引用 5 楼 abcwt112 的回复:
Quote: 引用 3 楼 zhangxiaojie0321 的回复:

Quote: 引用 2 楼 abcwt112 的回复:

Quote: 引用 1 楼 zhangxiaojie0321 的回复:

<class name="User2" table="User2">
class里面的name是全路径名字。

<hibernate-mapping package="pojo">
已经写了package....

额。。你用的什么数据库呢? 

如果一个表没有建立的话....<property name="hbm2ddl.auto">update</property>.....是可以自动新建的把?!

是的。自动更新数据库结构

#7


引用 6 楼 zhangxiaojie0321 的回复:
Quote: 引用 5 楼 abcwt112 的回复:

Quote: 引用 3 楼 zhangxiaojie0321 的回复:

Quote: 引用 2 楼 abcwt112 的回复:

Quote: 引用 1 楼 zhangxiaojie0321 的回复:

<class name="User2" table="User2">
class里面的name是全路径名字。

<hibernate-mapping package="pojo">
已经写了package....

额。。你用的什么数据库呢? 

如果一个表没有建立的话....<property name="hbm2ddl.auto">update</property>.....是可以自动新建的把?!

是的。自动更新数据库结构

那还能有啥错误..................坑爹了.................... Hibernate的一个小问题

#8


噢!!!找到错误了....列名不能用-这个符号 Hibernate的一个小问题

#9


因为你的Oracle用户是DBA权限,和相应权限下其它表冲突了。
在hibernate配置中,增加别名配置:
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop><!-- validate  create  create-drop  update  -->
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.default_schema">ssh</prop>
====最后一句
<prop key="hibernate.default_schema">ssh</prop>