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)
任何帮助将不胜感激,谢谢.
更新 - 解决问题
嗯,我期待一个胜利的配乐,但没关系......
我只是按照这个链接说的:
我读到Hibernate文档不推荐该链接中的内容,但我尝试遵循recomendations并通过一周处理错误.所以,我希望这有助于其他人.
并感谢所有的答案.
我相信这是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_id的Bar表.
通常我们不会以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中进行双向关系的方式.
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)
它不能为空,因为它是您的情况的主键。
| 归档时间: |
|
| 查看次数: |
20004 次 |
| 最近记录: |