【问题标题】:Getting error while using generic generator使用通用生成器时出错
【发布时间】:2020-03-18 11:47:33
【问题描述】:

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

错误

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

学生班

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;
    }
}

请帮忙

【问题讨论】:

  • 您可以尝试将int 替换为Integer 吗?
  • @SternK 没用!
  • 能否请您展示您的休眠配置以及您使用的 H2 版本?
  • 我正在使用弹簧靴。这是数据库的属性。 spring.h2.console.enabled=true spring.datasource.platform=h2 spring.datasource.url=jdbc:h2:mem:admin

标签: hibernate spring-boot jpa h2


【解决方案1】:

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

【讨论】:

  • 我之前试过这个,它也有效。不幸的是,给出一个错误有一个意外错误(类型=内部服务器错误,状态=500)。存在可选的 int 参数“id”,但由于被声明为原始类型,因此无法转换为空值。考虑将其声明为相应原始类型的对象包装器。
  • 我也尝试通过构造函数初始化 id 的值,所以它不会显示为 null 但它不起作用,得到同样的错误
  • @MindFlayerA,pepevalbe 的建议效果很好。请参阅工作示例here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多