我正在做一个使用JavaFX的项目,Hibernate.
我向字符串主键添加了不为空的约束,但它没有执行任何我预期的验证.它仍然接受空字符串作为有效输入.
我try 了"NotEmpty"、"NotBlank"、"Size"、"Pattern",但不起作用.当我将一个空对象传递给@NotNull时,它仍然执行该工作.我对Hibernate和任何与它相关的东西都是新手,所以我想我缺少基本的知识.
我也试图搜索在Hibernate上进行验证,但我找到了关于Spring MVC的解决方案,以及我在上面try 过的一些进行验证的方法.我发现Hibernate Validator包含许多不推荐使用的注释,并且我正在使用Jakarta验证,我不知道它是否与此相关.
更新:在修改约束时,我try 将hibernate.hbmddl.auto设置为create-drop以重新创建表,但不起作用.
这是我的代码.我希望Apartment.id是非空的,因 for each 居民都应该住在公寓里.
Apartment.java
package com.example.demo;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
public class Apartment {
@Id
@NotBlank
private String id;
}
Resident.java
package com.example.demo;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class Resident {
@Id
@GeneratedValue
private Integer id;
private String firstName;
private String lastName;
public Resident(String firstName, String lastName, Apartment apartment) {
this.firstName = firstName;
this.lastName = lastName;
this.apartment = apartment;
}
@ManyToOne
@JoinColumn(nullable = false)
private Apartment apartment;
}
使用两个实体的代码
package com.example.demo;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
public class ResidentFormController {
public TextField firstNameTextField;
public TextField lastNameTextField;
public TextField apartmentTextField;
public Button submitButton;
private ResidentService residentService;
private ApartmentService apartmentService;
@FXML
public void initialize() {
residentService = new ResidentService(new ResidentRepository());
apartmentService = new ApartmentService(new ApartmentRepository());
}
public void submitButtonOnAction() {
Apartment apartment = new Apartment(apartmentTextField.getText());
apartmentService.merge(apartment);
residentService.persist(new Resident(
firstNameTextField.getText(),
lastNameTextField.getText(),
apartment
));
SceneManager.switchScene(Scene.RESIDENT_LIST.getFileName());
}
}
I found this question Validation doesn't work on EntityManager.merge()
并将其作为以下代码进行了try ,但仍然不起作用
public void merge(T entity) {
HibernateUtility.getSessionFactory().inTransaction(session -> {
session.merge(entity);
session.flush();
});
}
以下是GitHub存储库:https://github.com/GiaoLe/demo
如果有任何部分的代码是不切实际的,有一些说明或参考是很好的,因为我找到了这么多关于Hibernate的过时教程.
非常感谢您抽出时间来.