我有点困惑,试图理解儿童实体如何在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;当我节省更少的列。谢谢。