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

时间:2017-02-27 14:13:38

标签: 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 = "id")
  private Collection<ReportColumn> columns;
  private String owner;
  // getters&setters...
}

@Entity
@Table(name = "savedcolumn")
@IdClass(value = ColumnId.class)
public class ReportColumn {
  @Id
  private String savedReportId;
  @Id
  private String columnName;
  private int columnOrder;
  // more 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();
  }
}

最后,我宣布了一个jpa存储库

public interface ReportRepository extends JpaRepository<Report, String> {

Collection<Report> findByOwnerUserName (String userName);

}

通过这个设置,我能够通过...

从我的数据库中插入和选择数据而没有任何问题
reportRepository.save();
来自jpaRepository的

...方法。当尝试使用比已保存在数据库中的列少的列保存报表时,我的问题就开始了。当我设置show_sql = true以查看正在进行的操作时,我注意到hibernate查询假装更新一个非包含的列,如下所示:

update savedcolumn set savedReportId = null where savedReportId = ?

我认为正在发生的事情是,hiberate尝试通过更新为null来解除报告实体与列的连接&#34; join&#34;表中的列。如果是这种情况,我想先问你:我是否为我的实体做了正确的ORM映射。其次,如何设置这些实体以告诉hibernate我希望删除Report子项,而不是&#34; detached&#34;当我节省更少的列。谢谢。

0 个答案:

没有答案