在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...
我错过了什么?
答案 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 - 你有两个类,分别叫做 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;
}
笔记本电脑类
@Entity
class Laptop{
@Id
private int laptopId;
private String brand;
}
如何解决这个问题
你可以通过两种方式实现它
将父实体上的 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;
}
您可以对子实体执行 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)使用继承时,遇到了这个问题。