【问题标题】:Hibernate unable to map many students to a classHibernate 无法将许多学生映射到一个班级
【发布时间】:2019-08-30 01:38:14
【问题描述】:

我有 2 个简单的实体:学生和班级。我想发布一个学生,我在其中指定它所属的类,但我陷入了休眠映射。

ClassModel.class

@Entity
@Table(name = "class" )
public class ClassModel implements Serializable {


@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@NotEmpty
@Size(max = 20)
@Column(name = "name")
private String name;

@Column(name = "tables")
private int tables;

@Column(name = "chairs")
private int chairs;

@Column(name = "teacher")
private String teacher;
(getters + setters)

学生模型

@Entity
@Table(name = "student")
public class StudentModel implements Serializable {

@Id
@Column(name = "student_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int student_id;

@NotEmpty
@Column(name = "name")
@Size(max = 50)
private String name;

@Column(name = "age")
private int age;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id")
private ClassModel classModel;
(getters + setters)
}

StudentController.java

...
@Autowired
private StudentService studentService;

@Autowired
private ClassService classService;

@PostMapping(value = "/save")
public StudentModel save(@RequestBody StudentModel studentModel){
    ClassModel classModel = classService.findById(studentModel.getClassId()).get();
    studentModel.setClassModel(classModel);
    return studentService.save(studentModel);
}
...

但是当我使用以下正文向 Postman 发出请求时:

{
    "name": "some name",
    "age": 12,
    "class_id": 1
}

我从休眠中收到以下错误:

Column 'class_id' cannot be null

我的休眠映射哪里出错了?

【问题讨论】:

    标签: java json spring spring-data-jpa spring-data


    【解决方案1】:

    这就是我在hibernate中加入工作的方式。看看:

    TrainingEntity.java

    @Id
    private Integer id;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "animal_id", nullable = false, insertable = false, updatable = false)
    private AnimalEntity animalEntity;
    
    @Column(name = "animal_id")
    private Integer animalId;
    

    AnimalEntity.java

    @Id
    private Integer id;
    
    @OneToMany(mappedBy = "animalEntity", fetch = FetchType.LAZY)
    private List<TrainingEntity> trainingEntityList = new ArrayList<>();
    

    这里是 AnimalEntity 和 TrainingEntity 之间的连接。 AnimalEntity 有一个 TrainingEntity 列表。

    【讨论】:

    • 很高兴听到这个消息!
    【解决方案2】:

    错误在这一行:

    "class_id": 1
    

    您使用的是列名而不是字段名。您必须将class_id 替换为classModel,其中classModel 将是一个对象。其他解决方案是通过 json 中的 id 找到 ClassModel 并将其设置为 StudentModel 的父级。

    【讨论】:

    • 我已经重构了代码,现在我得到了错误:“Unknown column 'id'”,关于 StudentModel 中的私有 ClassModel classModel
    • @AndrewT 我需要看看你用来保存它的代码
    • 我正在更新问题以包括控制器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2020-06-12
    • 2011-11-14
    • 2012-01-10
    • 1970-01-01
    • 2014-01-15
    • 2013-08-20
    相关资源
    最近更新 更多