java如何使用SpringJPA存储库正确保存带有外键的对象?
我第一次同时使用Hibernate和Spring进行一个项目。我选择了使用单向映射,结果非常好,除了一件事。每当我试图保存包含EventType对象的事件时。它给了我以下错误:
java.sql.SQLException: Field 'type_id' doesn't have a default value
我正在使用标准的JPA存储库函数evenementRepository.save(evenement);
以下是我的数据库的外观:
这是我的活动课
@Entity
@Table(name = "evenement")
@EntityListeners(AuditingEntityListener.class)
public class Evenement {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String naam;
private Date datum;
private String status;
private String beschrijving;
private String locatie;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "type_id", nullable = false, insertable = false, updatable = false, foreignKey = @ForeignKey(name = "evenement_ibfk_3"))
private Evenement_Type eventType;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "template_id", nullable = true, insertable = false, updatable = false, foreignKey = @ForeignKey(name = "evenement_ibfk_2"))
private Template template;
//getters and setters
这是我的事件类型类:
@Entity
@Table(name = "evenement_type")
@EntityListeners(AuditingEntityListener.class)
public class Evenement_Type {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String naam;
private String beschrijving;
//getters and setters
控制器
@RestController
@RequestMapping("/")
public class EvenementController {
@Autowired
EvenementDAO evenementDAO;
@PostMapping("/evenement")
public Evenement createEvenement(@Valid @RequestBody Evenement evenement) {
return evenementDAO.save(evenement);
}
刀
如您所见,我仔细检查了事件是否具有实际的事件类型,以及事件类型是否具有ID。 我百分之百肯定这不是问题所在。它在控制台中总是有一个输出
@Service
public class EvenementDAO {
@Autowired
EvenementRepository evenementRepository;
@Autowired
Template_TaakDAO template_taakDAO = new Template_TaakDAO();
@Autowired
TaakDAO taakDAO = new TaakDAO();
public Evenement save(Evenement evenement) {
System.out.println(evenement.getEventType().getId());
return evenementRepository.save(evenement);
}
JSON对象通过邮递员发送
{
"naam": "test-name",
"datum": "2021-08-08",
"status": "test-status",
"beschrijving": "test-description",
"locatie": "test-location",
"eventType": {
"id": 1,
"naam": "test-name",
"beschrijving": "test-description"
},
"template": null
}
还有一个类使用Event_Type作为外键,但也不起作用。 所有其他带有外键的类我都可以保存。 我很确定是映射还是数据库中的什么东西,但我不知道是什么。 很抱歉,我的很多代码都是用我的母语编写的,这是一个非常坏的习惯(你需要知道的是,晚上意味着事件)
请帮帮我,我已经被困很久了。 如果我忘记发布任何重要信息,请说出来
# 1 楼答案
异常表示您正试图在“type_id”字段中保存NULL,但在db中有非NULL约束,并且没有默认值
请看一下这部分:
您已经在type_id字段上定义了映射,但它没有映射到目标实体模型中。您应该将其添加到Evenment模型中,并填充现有的DB记录以修复该问题