有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用SpringJPA存储库正确保存带有外键的对象?

我第一次同时使用Hibernate和Spring进行一个项目。我选择了使用单向映射,结果非常好,除了一件事。每当我试图保存包含EventType对象的事件时。它给了我以下错误: java.sql.SQLException: Field 'type_id' doesn't have a default value

我正在使用标准的JPA存储库函数evenementRepository.save(evenement);

以下是我的数据库的外观:

enter image description here

这是我的活动课

@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) 个答案

  1. # 1 楼答案

    异常表示您正试图在“type_id”字段中保存NULL,但在db中有非NULL约束,并且没有默认值

    请看一下这部分:

    @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "type_id", nullable = false, insertable = false, updatable = false, foreignKey = @ForeignKey(name = "evenement_ibfk_3"))
        private Evenement_Type eventType;
    

    您已经在type_id字段上定义了映射,但它没有映射到目标实体模型中。您应该将其添加到Evenment模型中,并填充现有的DB记录以修复该问题