(Hibernate)java.sql.SQLException:Field';xxxx和x27;不';没有默认值

(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

Hibernate正在引发以下异常:

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);