TypeMismatchException提供的ID类型错误

时间:2012-02-27 15:36:18

标签: spring hibernate postgresql type-mismatch

在Hibernate上处理我的第一个应用程序时。在尝试从数据库中检索User对象时,我遇到以下异常:

  

org.hibernate.TypeMismatchException:提供了错误类型的id   class org.cw.form.User。预期:类java.lang.Integer,得到了类   java.lang.String中           在org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:109)           在org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:906)           在org.hibernate.impl.SessionImpl.load(SessionImpl.java:823)           在org.hibernate.impl.SessionImpl.load(SessionImpl.java:816)

我使用以下postgreSQL创建了USERS表:

CREATE SEQUENCE user2_id_seq; 

CREATE TABLE USERS(id integer NOT NULL DEFAULT nextval('user2_id_seq'), user_name   varchar(45) NOT NULL UNIQUE , password varchar(45) NOT NULL, email varchar(45) NOT NULL, PRIMARY KEY (id));

用户实体定义如下:

@Entity @Table(name="USERS") public class User {

@Id
@Column(name="ID")
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Integer id;

@Column(name="USER_NAME", unique = true)
private String userName;

@Column(name="PASSWORD")
private String password;

@Column(name="EMAIL")
private String email; .. all the getters and setters...

我错过了什么?

7 个答案:

答案 0 :(得分:5)

如果您要展示如何检索用户,那么回答会更容易。基于消息:

Provided id of the wrong type for class org.cw.form.User. 
Expected: class java.lang.Integer, got class java.lang.String

我猜你提供的是String而不是正确的类型(整数):

String userID = "1"; //Should be Integer userID = 1 instead
session.get(User.class, userID); 

答案 1 :(得分:3)

我有一个不同的罪魁祸首创造了这个问题:我复制粘贴了另一个实体的存储库,该存储库使用String作为主键类型。

所以我有

class MyEntity implements Serializable {

    @Id
    Integer id

结合使用
interface MyEntityRepository extends CrudRepository<MyEntity, String> {

产生错误信息。

简单地将接口类型从String更改为Integer解决了我的问题。

答案 2 :(得分:2)

我真的不知道它是否会解决你的问题,但由于你在数据库端使用序列生成id,我认为你应该使用序列生成器:

@Id
@Column(name="ID")
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="user2_id_seq")
private Integer id;

请参阅此帖子了解详情:Hibernate sequence on oracle, @GeneratedValue(strategy = GenerationType.AUTO)

答案 3 :(得分:2)

public User findClientByUsername(String login) {        
        Criteria criteria = sessionFactory.getCurrentSession().createCriteria(User.class);
        criteria.add(Restrictions.like("userName", login));
        return (User) criteria.uniqueResult();
    }

解决您的问题。

答案 4 :(得分:1)

当您要使用 Spring JPA 中包含不同类型主键的两个实体执行 one-to-one 映射时,经常会发生这种情况。

ex - 你有两个类,分别叫做 userlaptop

用户类

@Entity
class User{
   
    @Id
    private String userId;

    private String name;

 @OneToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY,targetEntity = Laptop.class)
@JoinColumn(name = "USER_ID",referencedColumnName = "USER_ID")
 private Laptop laptop;

}

笔记本电脑类

@Entity
class Laptop{

   @Id
   private int laptopId;

  private String brand;
}

如何解决这个问题

你可以通过两种方式实现它

  1. 将父实体上的 one-to-one 关系替换为 one-to-many

    @Entity
     class User{
    
         @Id
         private String userId;
    
         private String name;
    
      @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY,targetEntity = Laptop.class)
     @JoinColumn(name = "USER_ID",referencedColumnName = "USER_ID")
      private Laptop laptop;
    
     }
    
  2. 您可以对子实体执行 one-to-one 关系

<块引用>
  @Entity
class Laptop{

   @Id
   private int laptopId;

   private String brand;

   @OneToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER,targetEntity = 
    User.class)
    @JoinColumn(name = "USER_ID",referencedColumnName = "USER_ID")
     private User user;

}

答案 5 :(得分:0)

我也遇到同样的问题,如果您将id设置为autoincrement,那么它不需要任何设置方法,只需get就可以了,如下所述。

  public Long getId() {
       return id;
   }

答案 6 :(得分:0)

当我尝试对标识符类(@IdClass)使用继承时,遇到了这个问题。