【问题标题】:Hibernate - Null foreign key when trying to do an insertHibernate - 尝试插入时为空外键
【发布时间】:2018-12-21 10:14:44
【问题描述】:

当我进行插入时,traduction 中的外键(idMot 引用 mot)为空,而我的前端发送了正确的外键。我最终得到了这个错误:not-null 属性引用了一个空值或瞬态值:com.virtual.expertise.mydico.model.Traduction.mot

我想我的模型做错了什么,但仍然不知道是什么。

这里是翻译模型:

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

            @Column(name = "langue")
            private String langue;

            @Column(name = "traduction")
            private String traduction;

            @JsonBackReference(value = "mot-traduction")
            @ManyToOne(fetch = FetchType.EAGER)
            @JoinColumn(name = "idMot", nullable = false, insertable = true, 


updatable = false)
        private Mot mot;

        @CreationTimestamp
        @Column(name = "dateCreation")
        private Date dateCreation;

这里是 mot 模型:

@Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "libelle")
    private String libelle;

    @JsonBackReference(value = "user-mot")
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "idUser", nullable = false, insertable = true, updatable = false)
    private User user;

    /** les traductions. */
    @JsonManagedReference(value = "mot-traduction")
    @OneToMany(mappedBy = "mot", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<Traduction> traductions;

    @CreationTimestamp
    @Column(name = "dateCreation")
    private Date dateCreation;

这是转导表:

DROP TABLE IF EXISTS `traduction`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `traduction` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `langue` varchar(100) DEFAULT NULL,
  `traduction` varchar(100) DEFAULT NULL,
  `idMot` bigint(20) DEFAULT NULL,
  `dateCreation` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idMot_idx` (`idMot`),
  CONSTRAINT `idMot` FOREIGN KEY (`idMot`) REFERENCES `mot` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

这是我的网络服务:(在翻译中 idMot 显示为 null)

@POST
    @Path("/create")
    public Traduction createTraduction(Traduction traduction) throws Exception {
        return FacadeBackOffice.getInstance().getTraductionService().createTraduction(traduction);
    }

有人可以解决吗?

【问题讨论】:

  • 您是否为Traduction.mot 分配了一个未持久化的实例(还没有ID)?先尝试坚持下去。
  • 如果MotTraduction 之前没有被持久化,Mot.id 仍然为空。但在这种情况下,休眠通常会引发异常,并显示消息“分离的实体传递给持久”。也许GenerationType.AUTO 的东西不能正常工作。您使用的是哪个数据库和方言?
  • 我正在使用 mySQL 工作台...
  • 我没有在代码中看到你在哪里设置 mot:traduction.setMot(mot);

标签: java hibernate null foreign-keys


【解决方案1】:

在多对一映射中也使用级联类型。

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

            @Column(name = "langue")
            private String langue;

            @Column(name = "traduction")
            private String traduction;

            @JsonBackReference(value = "mot-traduction")
            @ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
            @JoinColumn(name = "idMot", nullable = false, insertable = true, 


updatable = false)
        private Mot mot;

        @CreationTimestamp
        @Column(name = "dateCreation")
        private Date dateCreation;

【讨论】:

  • 感谢您的帮助!!!我尝试了您的解决方案,但仍然得到相同的结果...
猜你喜欢
  • 2017-09-14
  • 2018-01-09
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2014-03-26
  • 1970-01-01
  • 2020-10-10
相关资源
最近更新 更多