我的项目有问题。当我浏览http://localhost:8080/user/form
以填充信息用户
然后提交表单以保存用户并自动将http://localhost:8080/user/list
指向显示列表用户,但会出现以下错误:
Hibernate:插入userdat(年龄,生日,性别,密码, 用户名)值s(?,?,?,?,?)2016年3月27日上午8:30:17 org.hibernate.engine.jdbc.spi.SqlExceptionHelper $ STANDAR dWarningHandler logWarning WARN:SQL警告代码:10000,SQLState: 01J01 2016年3月27日上午8:30:17 org.hibernate.engine.jdbc.spi.SqlExceptionHelper $ STANDAR dWarningHandler logWarning警告:数据库'D:\ PROJECTSPRING \ userdb' 没有创建,连接使得存在于数据库中。 3月27日, 2016年8:30:17 AM org.hibernate.hql.internal.QueryTranslatorFactoryInitiat或 initiateService INFO:HHH000397:使用ASTQueryTranslatorFactory Hibernate:选择user0_.username作为username1_0_,user0_.age为 age2_0_,user0_ .birthday as birthday3_0_,user0_.gender as gender4_0_,user0_.password as passw ord5_0_ from userdat user0_ Mar. 27,2016 8:30:17 am org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExce ptions WARN:SQL错误:20000,SQLState:22018 Mar 27,2016 8:30:17 am org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExce ptions ERROR:int类型的字符串格式无效。 [警告] org.springframework.web.util.NestedServletException:Request 处理失败;嵌套异常是 org.hibernate.exception.DataException:无法执行que ry
引起:org.hibernate.exception.DataException:无法执行 询问 在org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQL ExceptionTypeDelegate.java:52) 在org.hibernate.exception.internal.StandardSQLExceptionConverter.conver 吨(StandardSQLExceptionConverter.java:42) 在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlException) Helper.java:111)
引起:java.sql.SQLDataException:无效的字符串格式 对于类型i nt。 at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknow n来源) 在org.apache.derby.impl.jdbc.Util.generateCsSQLException(未知来源) ) 在org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException (未知来源)
此处提交UserDaoImpl.java
@Repository
public class UserDaoImpl implements UserDao{
@Autowired
public LocalSessionFactoryBean sessionFactory;
@Override
public void save(User user) {
// TODO Auto-generated method stub
Session session = sessionFactory.getObject().openSession();
session.save(user);
session.flush();
session.close();
}
@Override
public void update(User user) {
// TODO Auto-generated method stub
}
@Override
public List<User> listUsers() {
// TODO Auto-generated method stub
Session session = sessionFactory.getObject().openSession();
Query query = session.createQuery("from User");
return (List<User>)query.list();
}
此处归档User.java
@Entity
@Table(name = "userdat",uniqueConstraints={@UniqueConstraint(columnNames="username")})
public class User {
@Column(name = "gender", nullable = false)
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
@Id
@Column(name = "username", unique = true, nullable = false)
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Column(name = "password", nullable = false)
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
@Column(name = "birthday", nullable = false)
public Date getBirthDay() {
return birthDay;
}
public void setBirthDay(Date birthDay) {
this.birthDay = birthDay;
}
@Column(name="age", nullable = false)
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
private String userName;
private String passWord;
private Date birthDay;
private Integer age;
private Gender gender;
}
此处提交Gender.java文件
public enum Gender {
MALE("Male"),
FEMALE("Female"),
OTHER("Other");
private String name;
private Gender(String name) {
this.name = name;
}
public String getGender(){
return this.name;
}
}
此处在DB中创建表
public void createTable() throws SQLException{
try {
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection connection = DriverManager.getConnection("jdbc:derby:D:/PROJECTSPRING/dbuser;create=true");
createTableNotExist(connection,"userdat", "create table userdat"
+ "(username varchar(1000) primary key,"
+ "password varchar(1000),birthday date,"
+ "age integer,gender varchar(100))");
// createTableNotExist(connection,"subject","create table subject"
// + "(id bigint primary key generated always as identity(start with 1,increment by 1),"
// + "title varchar(1000),student integer,score integer)" );
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 0 :(得分:0)
我认为它是想要将Gender
存储为Integer,因为它是枚举类型。将数据库创建更改为:
性别整数
答案 1 :(得分:0)
如果枚举没有用@Enumerated
注释,则按序号保留。在这种情况下,hibernate预期为int,但获取varchar(100)。下面的代码解决了这个问题。
@Column(name = "gender", nullable = false)
@Enumerated(EnumType.STRING)
答案 2 :(得分:0)
我正在发布此答案,因为此错误也可能是由于在CSV文件中使用列名引起的。
这就是问题:我使用自动化工具从CSV格式的数据库中提取了一些数据。然后,我尝试将数据导入Apache Derby,但没有成功。 几个小时后,我终于发现应该从文件中删除列名。
这是一个非常简单的解决方案,但有时我们只想尽快进入流程,而忘记了有关流程配置的详细信息。
我希望这篇文章能帮助其他人。
干杯!