休眠中具有相同主键的一对一单向映射
One to One unidirectional mapping with same primary key in hibernate
我有两个 classes/tables(图元文件和行计数)具有一对一的关系。行数仅适用于某些图元文件。目前我有这个设置(简化):
MetaFile.java
@Entity
@Table(name = "file")
public class MetaFile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "file_id")
private int fileId;
// getters, setters, constructors...
}
RowCount.java
@Entity
@Table(name = "row_count")
public class RowCount implements Serializable {
@OneToOne
@JoinColumn(name="file_id")
private MetaFile file;
@Id
@Column(name="file_id")
private int file_id; // duplicate field needed so that crudrepo would recognise the id
private int rows;
public RowCount(MetaFile file, int rows) {
this.file = file;
this.rows = rows;
this.file_id = file.getFileId();
}
// getters, setters...
}
我正在为两者使用 crudrepositories 以简化持久性。
我首先保存图元文件以获得分配的 ID,然后我使用该图元文件和新 ID 创建一个行计数对象并保存它(如下所示)。然而,第二次保存失败了,因为图元文件没有立即保存到数据库中,而且外键约束也失败了。
metaFile = fileRepository.save(metaFile);
rowCountRepository.save(new RowCount(metaFile,getNumberOfRows(file));
元文件肯定得到了分配给它的有效 ID。有没有办法确保这两个持久化按顺序发生?
谢谢!
您可以按照 Hadi J 的建议使用 @mapsId
更改您的映射,以便在 RowCount
中有一个 pk/fk 列
@Entity
@Table(name = "row_count")
public class RowCount implements Serializable {
@OneToOne
@JoinColumn(name = "file_id")
@MapsId
private MetaFile file;
@Id
@Column(name="file_id")
private int file_id;
private int rows;
public RowCount(MetaFile file, int rows) {
this.file = file;
this.rows = rows;
}
// getters, setters...
}
我会使用双向关系来简化储蓄:
@Entity
@Table(name = "file")
public class MetaFile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "file_id")
private int fileId;
// getters, setters, constructors...
@OneToOne(cascade = {CascadeType.ALL}, mappedBy = "file")
private RowCount rowCount;
}
这样你就可以设置关系并保存
RowCount rowCount = new RowCount(metaFile, getNumberOfRows(file));
metaFile.setRowCount(rowCount);
metaFile = fileRepository.save(metaFile);
我有两个 classes/tables(图元文件和行计数)具有一对一的关系。行数仅适用于某些图元文件。目前我有这个设置(简化):
MetaFile.java
@Entity
@Table(name = "file")
public class MetaFile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "file_id")
private int fileId;
// getters, setters, constructors...
}
RowCount.java
@Entity
@Table(name = "row_count")
public class RowCount implements Serializable {
@OneToOne
@JoinColumn(name="file_id")
private MetaFile file;
@Id
@Column(name="file_id")
private int file_id; // duplicate field needed so that crudrepo would recognise the id
private int rows;
public RowCount(MetaFile file, int rows) {
this.file = file;
this.rows = rows;
this.file_id = file.getFileId();
}
// getters, setters...
}
我正在为两者使用 crudrepositories 以简化持久性。
我首先保存图元文件以获得分配的 ID,然后我使用该图元文件和新 ID 创建一个行计数对象并保存它(如下所示)。然而,第二次保存失败了,因为图元文件没有立即保存到数据库中,而且外键约束也失败了。
metaFile = fileRepository.save(metaFile);
rowCountRepository.save(new RowCount(metaFile,getNumberOfRows(file));
元文件肯定得到了分配给它的有效 ID。有没有办法确保这两个持久化按顺序发生?
谢谢!
您可以按照 Hadi J 的建议使用 @mapsId
更改您的映射,以便在 RowCount
@Entity
@Table(name = "row_count")
public class RowCount implements Serializable {
@OneToOne
@JoinColumn(name = "file_id")
@MapsId
private MetaFile file;
@Id
@Column(name="file_id")
private int file_id;
private int rows;
public RowCount(MetaFile file, int rows) {
this.file = file;
this.rows = rows;
}
// getters, setters...
}
我会使用双向关系来简化储蓄:
@Entity
@Table(name = "file")
public class MetaFile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "file_id")
private int fileId;
// getters, setters, constructors...
@OneToOne(cascade = {CascadeType.ALL}, mappedBy = "file")
private RowCount rowCount;
}
这样你就可以设置关系并保存
RowCount rowCount = new RowCount(metaFile, getNumberOfRows(file));
metaFile.setRowCount(rowCount);
metaFile = fileRepository.save(metaFile);