(Hibernate)java.sql.SQLException:Field';xxxx和x27;不';没有默认值
Hibernate正在引发以下异常:(Hibernate)java.sql.SQLException:Field';xxxx和x27;不';没有默认值,java,hibernate,Java,Hibernate,Hibernate正在引发以下异常: Caused by: java.sql.SQLException: Field 'catVerb_id' doesn't have a default value 人们说问题在于我的PKs没有AUTO_INCREMENT语句,但是你可以看到我已经在数据库中这样做了,问题还在继续。因此,我带来了我的类和数据库实现 我想我的问题是考试课。。。有人能告诉我怎么测试这个吗 (是的,有些单词是葡萄牙语的,但你能理解) 分类平均值 @Entity @Table(nam
Caused by: java.sql.SQLException: Field 'catVerb_id' doesn't have a default value
人们说问题在于我的PKs没有AUTO_INCREMENT语句,但是你可以看到我已经在数据库中这样做了,问题还在继续。因此,我带来了我的类和数据库实现
我想我的问题是考试课。。。有人能告诉我怎么测试这个吗
(是的,有些单词是葡萄牙语的,但你能理解)
分类平均值
@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;
}
}
有意义的
@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;
}
...
}
在数据库中
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
);
任何帮助都将不胜感激,谢谢
更新-问题已解决
嗯,我期待着一首胜利的配乐,但没关系
我只是按照这个链接说的:
我读到Hibernate文档不推荐该链接中的内容,但我尝试按照建议进行操作,并花了一周时间处理错误。所以,我希望这能帮助其他人
谢谢你的回答。如果你在
@JoinColumn
中使用相同的列catVerb\u id
@JoinColumn(name="catVerb_id", nullable = true)
试着把它改成
@JoinColumn(name="catVerb_id", insertable = false, updatable = false)
它不能为null,因为它是您的主键。我同意提供的链接。它按照链接工作。据我所知, 移除下面的部分确实对我有用 之前:
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="catVerb_id", insertable = false, updatable = false)
之后:
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="catVerb_id")
我认为是
signifidosVerbete
插入导致了不能为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;
}
通过这样做,关系由Bar
拥有,当您按照我所述进行插入时,您将插入1个Foo
,以及2个Bar
,它们已经具有Foo\u id
作为插入的一部分
这就是我们在Hibernate中通常处理双向关系的方式。java.sql.SQLException:字段“xxxx”没有默认值 (又称间接获取。延迟加载问题) 我今天遇到了这个问题 结果是在我的情况下有几个问题 我发现必须修复的第一件事是,所讨论的列表需要延迟加载。我所说的延迟加载是指当数据库“处于会话中”时,必须从数据库访问它。现在,我发现在处理Fetch.LAZY时,您必须执行一个小技巧,这样,当您将引用对象加载到容器中时,您需要(似乎不必要)调用该对象上的方法。仅仅返回引用是不够的,即使在会话对象内部也是如此 例如,不要只是这样说:
public List<Apple> getApples(Kid kid) throws KidNotFoundException
{
log.info("getApples (service) called");
kid = get(kid);
List<Apple> list = kid.getApples();
return list;
}
可以调用对象上的任何方法来触发JPA加载对象(或多个对象),在本例中,我只调用了list.size()方法非常方便,它看起来不像调用一个看似不必要的kid.getName()那么不合适;从专业的角度来看。我多么希望有一个关于Fetch.LAZY的好教程,我本可以向我指出这一切。我想是另一本书的素材
这迫使JPA从数据库中实际加载引用的对象
public List<Apple> getApples(Kid kid) throws KidNotFoundException
{
log.info("getApples (service) called");
kid = get(kid);
List<Apple> list = kid.getApples();
list.size();
return list;
}
Bucket表中只有一条记录,而不是两条!如果您试图使用列表来代替集合(又称为.unique),这一点非常重要。在字段id上声明注释,而不是在get方法中声明注释。但我了解到,我们可以在get方法或字段上定义注释,这不利于在同一类中同时使用这两种方法。。。我读错了吗?不确定,我使用的每一个参考资料。。。它是在字段上声明的,你在哪里读到的?这是一个例子:此外,我有一个这样映射的类,它工作得很好…@fmodos在getter上声明还不错。。这不是问题所在,您是否有查询u exec?顺便说一句,如果你使用set,你应该重写equals和hashcode方法:@GeneratedValue(strategy=GenerationType.IDENTITY)对于OneToMany,使用OneToMany(targetEntity=,mappedBy=)而不是joinColumn我也尝试过,但没有任何改变。。。嘿,我能把测试代码放在这里吗?也许我做错了什么……哎呀,我刚刚读了你对那个文档的更新,这似乎暗示了我在这里描述的内容。不过,我不懂葡萄牙语:这是解决问题的答案。非常感谢,阿德里安!我不知道这些限定符(可更新、可插入)会影响操作。我想我需要深入了解Hibernate如何将其转换为sql操作。很高兴它能帮上忙(哇,快2年了)。如果它解决了你的问题,请考虑接受答案。我不是原来的问题的答案:我在研究我自己的问题时找到了答案。我投了赞成票,这就是我所能做的:)@gruszczy lol为我的愚蠢感到抱歉,我以为你是OP基地根据你所说的:P我应该检查一下名字:P很抱歉这对我也有效,我很想知道一个确切的答案为什么有效。我将用我在不久的将来得到的更新答案有趣的是,拥有
insertable=false,updateable=false
似乎不会导致Fetch.LAZY出现问题。。。
public List<Apple> getApples(Kid kid) throws KidNotFoundException
{
log.info("getApples (service) called");
kid = get(kid);
List<Apple> list = kid.getApples();
return list;
}
list.size();
public List<Apple> getApples(Kid kid) throws KidNotFoundException
{
log.info("getApples (service) called");
kid = get(kid);
List<Apple> list = kid.getApples();
list.size();
return list;
}
/**
* "Buckets"
* an Apple can be give to 0-to-n Kids ...
*/
@ManyToMany(cascade=CascadeType.PERSIST)
@JoinTable(name="Buckets",
joinColumns=@JoinColumn(name="Apple_id"),
inverseJoinColumns=@JoinColumn(name="Kid_id"))
private List<Kid> kids;
public List<Kid> getKids() {
return kids;
}
public void setKids(List<Kid> kids) {
this.kids = kids;
}
/**
* a Kid can have 0-n Apples
*/
@ManyToMany(mappedBy="kids", cascade=CascadeType.PERSIST)
private List<Apple> apples;
kids.add(apple);
apple.add(kids);