gpt4 book ai didi

java - 违反外键约束 JPA

转载 作者:行者123 更新时间:2023-12-02 09:46:27 28 4
gpt4 key购买 nike

编辑:此代码实际上工作正常。这个问题是不相关的,是由于一个冲突的实体,它正在创建一个外键约束并阻止我插入到 DataFile 表中。

我在处理简单的 JPA 映射时遇到了一些真正的问题 @OneToMany映射。

我正在使用 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() { }
}

这是我的 EntityBaseItem.java,其中 @Id居住地:
@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;
}

我想这取决于我的 @IdEntityBaseItem就像我删除它并在 Study2 中添加 @Id 一样类然后它按预期工作,但是必须有某种方法来保持 @IdEntityBaseItem并且仍然使用 @JoinColumn ?我的代码中的其他地方没有任何问题,而且我还有各种其他映射,它们不像这个映射那么简单。

我知道错误意味着什么,但是我不知道为什么会发生这种情况。对我来说,我希望我的代码能够工作并自动级联 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;

它指出许多 DataFile 存在于一个 Study2 类中

关于java - 违反外键约束 JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26862289/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com