TypeMismatchException提供的ID类型错误

spe*_*0ne 6 postgresql spring hibernate type-mismatch

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

org.hibernate.TypeMismatchException:为类org.cw.form.User提供了错误类型的id.预期:类java.lang.Integer,org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java: 906)org.hibernate.impl.SessionImpl.load(SessionImpl.java:823)atg.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));
Run Code Online (Sandbox Code Playgroud)

用户实体定义如下:

@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...
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Jan*_*ock 9

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

所以我有

class MyEntity implements Serializable {

    @Id
    Integer id
Run Code Online (Sandbox Code Playgroud)

结合

interface MyEntityRepository extends CrudRepository<MyEntity, String> {
Run Code Online (Sandbox Code Playgroud)

这产生了错误消息。

只需将接口类型从 String 更改为 Integer 即可解决我的问题。


Naf*_*ema 6

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

前 - 你有两个类叫做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;

}
Run Code Online (Sandbox Code Playgroud)

笔记本电脑类

@Entity
class Laptop{

   @Id
   private int laptopId;

  private String brand;
}
Run Code Online (Sandbox Code Playgroud)

如何克服这个问题

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

  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;
    
     }
    
    Run Code Online (Sandbox Code Playgroud)
  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;

}
Run Code Online (Sandbox Code Playgroud)


Mik*_*unu 5

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

Provided id of the wrong type for class org.cw.form.User. 
Expected: class java.lang.Integer, got class java.lang.String
Run Code Online (Sandbox Code Playgroud)

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

String userID = "1"; //Should be Integer userID = 1 instead
session.get(User.class, userID); 
Run Code Online (Sandbox Code Playgroud)