编辑:此代码实际上可以正常工作。这个问题是无关的,并且是由于冲突的Entity正在创建外键约束并阻止我插入DataFile表。
对于一些简单的@OneToMany
映射,我在一些JPA映射方面遇到了一些麻烦。
我正在使用EclipseLink和DerbyDB。
@Entity( name = "study2" )
@Access( AccessType.FIELD )
public class Study2 extends EntityBaseItem {
private List<DataFile> datafiles = new ArrayList<DataFile>();
public Study2() { }
@OneToMany( cascade = CascadeType.ALL, orphanRemoval = true )
@JoinColumn( name="STUDY_ID", referencedColumnName = "ID" )
@Access( AccessType.PROPERTY )
public List<DataFile> getDatafiles() {
return this.datafiles;
}
public void setDatafiles( List<DataFile> dfList ) {
this.datafiles = dfList;
}
数据文件
@Entity( name = "DataFile" )
public class DataFile extends EntityBaseItem<DataFile> {
private String filename;
private long filesize;
private String fileStatus;
private String fileType;
private String fileSubType;
public DataFile() { }
}
这是
@Id
所在的我的EntityBaseItem.java:@MappedSuperclass
public abstract class EntityBaseItem {
@Id
@GeneratedValue( strategy = GenerationType.TABLE )
protected Integer id;
protected EntityBaseItem() {}
public Integer getId() {
return id;
}
public void setId( Integer id ) {
this.id = id;
}
@Override
public int hashCode() {
int hash = 0;
hash += ( this.getId() != null ? this.getId().hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
if (this == object)
return true;
if (object == null)
return false;
if (getClass() != object.getClass())
return false;
EntityBaseItem other = (EntityBaseItem)object;
if (this.getId() != other.getId() && (this.getId() == null || !this.id.equals(other.id))){
return false;
}
return true;
}
}
问题是,当我创建带有一些DataFile对象的Study2对象并将其持久化到数据库时,出现错误
UPDATE on table 'DATAFILE' caused a violation of foreign key constraint 'DATAFILE_STUDY_ID' for key
如果我更改getDataFiles()上的注释并删除
@JoinColumn
(请参见下文),则映射有效,但是它创建了一个联接表,而我实际上只希望在DataFile表中有一个联接列:@OneToMany( cascade = CascadeType.ALL, orphanRemoval = true )
@Access( AccessType.PROPERTY )
public List<DataFile> getDatafiles() {
return this.datafiles;
}
我想这是因为我将
@Id
放入EntityBaseItem
中时,是因为我删除了Study2
并在@Id
类中添加了@Id之后便按预期工作了,但是必须有某种方法可以将EntityBaseItem
保留在@JoinColumn
中,并且仍然使用ojit_code吗?我的代码中的其他地方都没有任何问题,而且还有其他各种映射,它们不像此映射那么简单。我知道错误的含义,但是我不知道为什么会发生。对我来说,我希望我的代码能够正常工作并自动为DataFiles层叠一个新的ID。
这是实际上导致引发错误的代码:
Study2 testStudy = new Study2();
// set some datafiles etc.
EntityManager em = getEM(); // gives me EntityManager
em.getTransaction().begin();
em.persist( testStudy );
em.getTransaction().commit();
我将其简化为测试,在.commit()上引发错误,然后回滚提交。
最佳答案
更改您的映射
public class Study2(){
@OneToMany( cascade = CascadeType.ALL, orphanRemoval = true,mappedBy="study2")
@Access( AccessType.PROPERTY )
public List<DataFile> getDatafiles() {
return this.datafiles;
}
}
在这里,我们说DataFile是通过DataFile类中的“study2”映射的,而Study2具有JoinColumn。而且Study2是关系的反面,并且在关系更新时不会更新关系。
在DataFile中添加一个字段Study2,我已经在字段上指定了映射。您可以更改
@ManyToOne
@JoinColumn(name="STUDY_ID", referencedColumnName = "ID")
private Study2 study2;
它指出在一个Study2类中存在许多DataFile