Java ConstraintViolationException:重复条目
我想在linf中有很多档案,有些档案可能有空linf。 我的基本hibernate注释如下: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
@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);
}