首页 > 解决方案 > 使用通用生成器时出错

问题描述

使用 Spring Boot 2.1.1 和 H2 数据库测试 JPA。

错误

出现意外错误(类型=内部服务器错误,状态=500)。无法通过反射设置字段值 [ST30790] 值:[class com.example.demo.model.Student.id] com.example.demo.model.Student.id 的设置器;嵌套异常是 org.hibernate.PropertyAccessException:无法通过反射设置字段值 [ST30790] 值:com.example.demo.model.Student.id 的 [class com.example.demo.model.Student.id] setter

学生班

package com.example.demo.model;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Student {

    @Id
    @GeneratedValue(generator = "Student_id")
    @GenericGenerator(name = "Student_id", strategy = "com.example.demo.model.StudentGenerator")
    private int id;
    private String email;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

我的发电机

package com.example.demo.model;

import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.enhanced.SequenceStyleGenerator;

import java.io.Serializable;
import java.util.Random;

public class StudentGenerator extends SequenceStyleGenerator {

    private static final String STUDENT_ID_PREFIX = "ST";

    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
        return STUDENT_ID_PREFIX + String.valueOf(generateID());
    }

    public static char[] generateID() {

        //Creating object of Random class
        Random obj = new Random();

        char[] otp = new char[5];

        for (int i = 0; i < 5; i++) {
            otp[i] = (char) (obj.nextInt(10) + 48);
        }
        System.out.print("Your OTP is : " + otp.toString());
        return otp;
    }
}

请帮忙

标签: hibernatespring-bootjpah2

解决方案


您的生成器输出是字符串,但是您的学生实体 ID 是 int。更改intstring学生id属性,它应该可以工作。


推荐阅读