【问题标题】:Error: java.sql.SQLDataException,Invalid character string format for type int. I really don't understand?错误:java.sql.SQLDataException,int 类型的字符串格式无效。我真的不明白?
【发布时间】:2016-03-27 08:56:17
【问题描述】:

我的项目有问题。当我浏览http://localhost:8080/user/form 填写用户信息时

然后提交表单保存用户并自动直接http://localhost:8080/user/list显示列表用户,但出现以下错误:

休眠:插入用户数据(年龄、生日、性别、密码、 用户名)值 s (?, ?, ?, ?, ?) Mar 27, 2016 8:30:17 AM 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 秒 org.hibernate.hql.internal.QueryTranslatorFactoryInitiat 或 启动服务信息:HHH000397:使用 ASTQueryTranslatorFactory Hibernate:选择 user0_.username 作为 username1_0_,user0_.age 作为 age2_0_, user0_ .birthday 作为birthday3_0_, user0_.gender 作为 性别 4_0_,user0_.password 作为密码 5_0_ 来自 userdat user0_ Mar 2016 年 2 月 27 日上午 8:30:17 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExce ptions WARN:SQL 错误:20000,SQLState:22018 2016 年 3 月 27 日 上午 8:30:17 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExce 选项错误:int 类型的字符串格式无效。 [警告] org.springframework.web.util.NestedServletException:请求 处理失败;嵌套异常是 org.hibernate.exception.DataException:无法执行查询

原因:org.hibernate.exception.DataException:无法执行 询问 在 org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQL ExceptionTypeDelegate.java:52) 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.conver t(标准SQLExceptionConverter.java:42) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlException Helper.java:111)

原因:java.sql.SQLDataException:无效的字符串格式 对于类型 i nt。 在 org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(未知 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;
    }
        }

这里在数据库中创建表

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();
        }

【问题讨论】:

  • 尝试在Gender 类上使用Embeddable 注释,在User 类中的Gender 字段上使用Embedded 注释。参考link查看用法。
  • @MadhusudanaReddySunnapu,我已经尝试过你的方式,但是当我mvn jetty:run 运行服务器但出现错误时:
  • 引起:org.springframework.beans.factory.BeanCreationException:无法自动连接字段:私有edu.java.spring.service.user.dao.UserDao edu.java.spring.s ervice。 user.controller.UserRestServiceController.userDao;嵌套异常是或 g.springframework.beans.factory.BeanCreationException:创建名为“userDaoImpl”的 bean 时出错:注入自动装配的依赖项失败;嵌套异常
  • 是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:public org.springframework.orm.hibernate4.LocalSessionFactoryBean edu.jav a.spring.service.user.dao.impl.UserDaoImpl .sessionFactory;嵌套异常是 o rg.springframework.beans.factory.BeanCreationException:在 ServletContext 资源 [/WEB-INF/userservice-servlet.xml] 中定义名称为“sessionFactory”的 bean 创建错误:调用 init 方法失败;嵌套异常是 org.hibernate e.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tupl e.component.PojoComponentTuplizer]
  • @MadhusudanaReddySunnapu,你还有别的办法????

标签: spring hibernate


【解决方案1】:

如果枚举没有使用@Enumerated 注释,则它们会按序号保留。在这种情况下,hibernate 需要 int 但得到 varchar(100)。下面的代码解决了这个问题。

@Column(name = "gender", nullable = false)
@Enumerated(EnumType.STRING)

【讨论】:

    【解决方案2】:

    我认为它想将Gender 存储为整数,因为它是枚举类型。将数据库创建更改为:

    性别整数

    【讨论】:

      【解决方案3】:

      我发布此答案是因为在 CSV 文件中使用列名也可能导致此错误。

      事情是这样的:我使用自动化工具从 CSV 格式的数据库中提取了一些数据。然后我尝试将数据导入 Apache Derby,但没有成功。 几个小时后,我终于发现应该从文件中删除列名。

      这是一个非常简单的解决方案,但有时我们只想尽快进入流程而忘记有关流程配置的详细信息。

      我希望这篇文章能帮助其他人。

      干杯!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-21
        • 2017-09-28
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        • 1970-01-01
        • 2019-11-15
        相关资源
        最近更新 更多