Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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 如何在JPA中使用复合键更新/删除子项_Java_Mysql_Hibernate_Jpa - Fatal编程技术网

Java 如何在JPA中使用复合键更新/删除子项

Java 如何在JPA中使用复合键更新/删除子项,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,我在试图理解儿童实体如何进入Jpa时有点困惑。以下是我所拥有的: 我创建了这个类 @Entity @Table(name="savedreport") public class Report { @Id private int id; private String reportName; @OneToMany(cascade = CascadeType.ALL) @JoinColumn (name ="savedReportId", referencedColumnName

我在试图理解儿童实体如何进入Jpa时有点困惑。以下是我所拥有的:

我创建了这个类

@Entity
@Table(name="savedreport")
public class Report {
  @Id
  private int id;
  private String reportName;
  @OneToMany(cascade = CascadeType.ALL)
  @JoinColumn (name ="savedReportId", referencedColumnName = "id")
  private Collection<ReportColumn> columns;
  private String owner;
  // getters&setters...
}
ColumnId如下所示:

public class ColumnId implements Serializable {
  private static final long serialVersionUID = 1L;
  private String columnName;
  private String savedReportId;
  @Override
  public int hashCode() {
     return reporteId.hashCode() + field.hashCode();
  }
}
update savedcolumn set savedReportId = null where savedReportId = ?
最后,我声明了一个jpa存储库

public interface ReportRepository extends JpaRepository<Report, String> {

Collection<Report> findByOwnerUserName (String userName);

}
。。。方法来自jpaRepository。我的问题始于尝试保存列数少于已保存在数据库中的列数的报表。当我设置show_sql=true以查看发生了什么时,我注意到hibernate query假装更新了一个未包含的列,如下所示:

public class ColumnId implements Serializable {
  private static final long serialVersionUID = 1L;
  private String columnName;
  private String savedReportId;
  @Override
  public int hashCode() {
     return reporteId.hashCode() + field.hashCode();
  }
}
update savedcolumn set savedReportId = null where savedReportId = ?

我认为正在发生的是Hibrate试图通过更新表中的“join”列使其为空来将报表实体与列分离。如果是这种情况,我想首先问你:我是否为我的实体做了正确的ORM映射。第二,我如何设置这些实体,以便告诉hibernate我希望在保存较少的列时删除报表子项,而不是“分离”。提前感谢。

I'va也尝试过这样使用孤儿删除:@OneToMany(cascade=CascadeType.ALL,orphandremovation=true)@JoinColumn(name=“savedReport”,referencedColumnName=“id”)私有集合列;但这似乎没有任何区别。我认为您的映射是错误的,请检查本文。无论如何,有两种方法可以实现复合键1-2,但我始终更喜欢使用[at]Embedded和[at]EmbeddedId的第二种方法