(休眠)值java.sql.SQLException:字段"XXXX"没有缺省值

vit*_*ati 7 java hibernate

Hibernate抛出以下异常:

Caused by: java.sql.SQLException: Field 'catVerb_id' doesn't have a default value
Run Code Online (Sandbox Code Playgroud)

人们说问题在于我的PK没有AUTO_INCREMENT语句,但你可以看到我在我的数据库中完成了这个并且问题仍在继续.所以,我带来了我的类和我的数据库实现.

我认为我的问题出在测试课上......有人可以告诉我如何测试这个?

(是的,有些单词是葡萄牙语,但你可以理解).

CategoriaVerbete

@Entity
@Table(name="verbete_categoria")
public class CategoriaVerbete implements Serializable{
    private long id;
    private String nome;
    private String descricao;
    private int serie;
    private Set<Verbete> verbetes = new HashSet<Verbete>();
    private Set<SignificadosVerbete> significados = new HashSet<SignificadosVerbete>();

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="catVerb_id")
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }

    ...

    @OneToMany(cascade = {CascadeType.ALL})
    @JoinColumn(name="catVerb_id", nullable = true) 
    public Set<Verbete> getVerbetes() {
        return verbetes;
    }
    public void setVerbetes(Set<Verbete> verbetes) {
        this.verbetes = verbetes;
    }

    @OneToMany(cascade = {CascadeType.ALL})
    @JoinColumn(name="catVerb_id", nullable = true)
    public Set<SignificadosVerbete> getSignificados() {
        return significados;
    }
    public void setSignificados(Set<SignificadosVerbete> significados) {
        this.significados = significados;
    }

}
Run Code Online (Sandbox Code Playgroud)

Verbete

@Entity
@Table(name="verbete")
public class Verbete implements Serializable{
   ...

    @ManyToOne
    @JoinColumn(name="catVerb_id", insertable = false, updatable = false)
    public CategoriaVerbete getCategoria() {
        return categoria;
    }
    public void setCategoria(CategoriaVerbete categoria) {
        this.categoria = categoria;
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

SignificadosVerbete

@Entity
@Table(name="verbete_significados")
public class SignificadosVerbete {
    ... 

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="catVerb_id", insertable = false, updatable = false)
    public CategoriaVerbete getCategoria() {
        return categoria;
    }
    public void setCategoria(CategoriaVerbete categoria) {
        this.categoria = categoria;
    }

   ...

}
Run Code Online (Sandbox Code Playgroud)

在数据库中......

CREATE TABLE verbete_categoria (
catVerb_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
catVerb_nome VARCHAR(100) UNIQUE,
catVerb_descricao MEDIUMTEXT,
catVerb_serie INT NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激,谢谢.

更新 - 解决问题

嗯,我期待一个胜利的配乐,但没关系......

我只是按照这个链接说的:

https://www.ibm.com/developerworks/community/blogs/fd26864d-cb41-49cf-b719-d89c6b072893/entry/como_criar_relacionamento_onetomany_com_hibernate?lang=en

我读到Hibernate文档不推荐该链接中的内容,但我尝试遵循recomendations并通过一周处理错误.所以,我希望这有助于其他人.

并感谢所有的答案.

Adr*_*hum 6

我相信这是SignificadosVerbete导致cannot be null问题的插入(我强烈建议您打开sql跟踪以查看哪个查询导致问题).

这是双向一对多关系的常见问题.你有什么是这样的:

class Foo {
    @Id
    @Column("foo_id")
    Long id;

    @OneToMany(cascade=ALL)
    @JoinColumn("foo_id")
    Set<Bar> bars;
}

class Bar {
    @Id
    @Column("bar_id")
    Long id;

    @ManyToOne
    @JoinColumn("foo_id", insertable=false, updatable=false)
    Foo foo;
}
Run Code Online (Sandbox Code Playgroud)

这种映射将导致关系被拥有Foo,并且这将创建多个insert+update语句:当您插入一个Foo2 Bar秒时,将会发生的事情是它将首先插入它Foo,而2个Bar 没有 FK foo_id.然后两个更新将被发放给每一个Bar更新正确foo_idBar表.

通常我们不会以OneToMany这种方式映射双向映射,我们这样做:

class Foo {
    @Id
    @Column("foo_id")
    Long id;

    @OneToMany(mappedBy="foo", cascade=ALL)
    Set<Bar> bars;
}

class Bar {
    @Id
    @Column("bar_id")
    Long id;

    @ManyToOne
    @JoinColumn("foo_id")
    Foo foo;
}
Run Code Online (Sandbox Code Playgroud)

通过这样做,关系是由Bar,并且当您按照我的描述插入时,您将插入已经具有插入的一部分的1 Foo和2 .Barfoo_id

这就是我们通常在Hibernate中进行双向关系的方式.


Ale*_*lex 0

catVerb_id如果您使用相同@JoinColumn的列

@JoinColumn(name="catVerb_id", nullable = true) 
Run Code Online (Sandbox Code Playgroud)

尝试将其更改为

@JoinColumn(name="catVerb_id", insertable = false, updatable = false) 
Run Code Online (Sandbox Code Playgroud)

它不能为空,因为它是您的情况的主键。