Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConstraintViolationException:重复条目_Java_Mysql_Hibernate - Fatal编程技术网

Java ConstraintViolationException:重复条目

Java ConstraintViolationException:重复条目,java,mysql,hibernate,Java,Mysql,Hibernate,我想在linf中有很多档案,有些档案可能有空linf。 我的基本hibernate注释如下: @Entity public class Linf { @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) public Set<Archive> getArchive() { return archives; } @Id @GeneratedValue(stra

我想在linf中有很多档案,有些档案可能有空linf。 我的基本hibernate注释如下:

@Entity
public class Linf {
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    public Set<Archive> getArchive() {
        return archives;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    public long getId() {
        return this.id;
    }
}

@Entity
public class Archive {
    public Archive() {
    }

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    public Linf getLinf() {
        return linf;
    }

    public void setLinf(Linf linf) {
        this.linf = linf;
    }


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    public long getId() {
        return this.id;
    }


}
使进程崩溃的最后一个sql命令是:

插入Linf_存档(Linf_ID,存档ID)值(?,)

此表中的两个字段都不能为空

你知道为什么会这样吗

PS:我已经隔离了导致崩溃的代码。下面是产生问题的简单场景:

Session sess = getSessionFactory().getCurrentSession();
sess.beginTransaction();
Archive a = new Archive();
Linf linf1 = new Linf();
Linf linf2 = new Linf();
linf1.setTitle("aa1");
linf2.setTitle("aa2");
linf1.getArchive().add(a);
linf2.getArchive().add(a);
sess.save(linf1);
sess.save(linf2);
sess.getTransaction().commit();

请注意,归档文件的linf为零。这可能是违法的吗?但是如果你真的想要这个方案呢?

请确保你使用的是正确的
mysqldialent

此外,在将
存档
添加到
Linf
时,是否在保存前设置父对象

    public void add(Archive archive){
         if(this.archives == null){
              this.archives = new HashSet<Archive>();
         }
         archive.setLinf(this); //setting the parent
         this.archives.add(archive);
    }
公共作废添加(归档){
if(this.archives==null){
this.archives=new HashSet();
}
archive.setLinf(this);//设置父级
this.archives.add(归档);
}

MailSourceFile
添加到
Archive
时相同?这是处理外键填充所必需的。

我发现,
@ManyToMany
关系正是这里应该使用的关系。如果Single对象属于两个不同的集合,那么在
@OneToMany

可能重复的情况下会发生上述异常,因为我希望某些档案不属于任何Linf,所以我不希望。有可能制作出符合这个要求的模型吗?@stiv:是的,很好。在这种情况下,请直接保存
存档文件。我希望Linf映射列在归档文件中可以为空。额外保存包含空Linf的新归档文件不会有帮助。@stiv:你是什么意思?它不符合您的要求,或者它会带来一些问题?如果您试图通过Linf保存未关联的归档文件,那么这是根本错误的。我也不理解您的意思。如果找不到某种存档,我将创建新的存档()并保存它。但我仍然得到这个例外。我的注释有什么问题?
    public void add(Archive archive){
         if(this.archives == null){
              this.archives = new HashSet<Archive>();
         }
         archive.setLinf(this); //setting the parent
         this.archives.add(archive);
    }