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)
我错过了什么?
我有另一个造成此问题的罪魁祸首:我复制粘贴了另一个实体的存储库,该存储库使用 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 即可解决我的问题。
当您要one-to-one在 Spring JPA 中对包含不同类型主键的两个实体执行映射时,经常会发生这种情况。
前 - 你有两个类叫做user和laptop
用户等级
@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)
如何克服这个问题
你可以通过两种方式实现它
替换与父实体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)
one-to-one您可以在子实体上执行关系
Run Code Online (Sandbox Code Playgroud)@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; }
如果你要展示如何检索用户,那么回答会更容易.基于消息:
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)
| 归档时间: |
|
| 查看次数: |
29223 次 |
| 最近记录: |