我有2个具有以下映射的实体
FileContent.java
@Entity
@Table(name="FILE_CONTENT", schema="COMMON")
public class FileContent implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
private Long id;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "FILE_ID")
private File docFile;
}
和File.java
@Entity
@Table(name="FILE", schema="COMMON")
public class File implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
private Long id;
@Column(name = "FILE_NAME")
private String fileName;
}
到目前为止,此映射工作正常,因为我可以使用fileContent.getDocFile()获取File。
因此,是否也可以在文件内映射FileContent?
我试图以这种方式添加映射,但是它不起作用,当我使用file.getFileContent()访问时,我总是得到null。
@Entity
@Table(name="FILE", schema="COMMON")
public class File implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
private Long id;
@Column(name = "FILE_NAME")
private String fileName;
@OneToOne(mappedBy = "docFile", cascade = CascadeType.ALL)
private FileContent fileContent;
}
我也按照here中的建议尝试使用@MapsId和@PrimaryKeyJoinColumn,但仍然无法使其正常工作。
我究竟做错了什么?
================================================== =================
于8/8/2019编辑
感谢Razib的回答,它运行良好。
但是,我发现从数据库中选择
FILE
记录而不是从新保存的FILE
对象中选择该记录时,它正在工作。File file = new File();
file.setFileName("sample.txt")
fileRepo.saveAndFlush(file);
File fileContent = new FileContent();
fileContent.set....;
fileContent.setFile(file);
fileContentRepo.saveAndFlush(fileContent);
return file;
我没有使用
Cascade
保存这些实体。当我使用file
访问返回file.getFileContent();
时,它为null。 最佳答案
您正在寻找的是双向一对一映射。现在,仅以一种方式完成映射。在双向映射中,需要将File
引用放在FileContent
中,反之亦然。检查以下代码段-
文件:
@Entity
@Table(name="FILE", schema="COMMON")
public class File {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
private Long id;
@Column(name = "FILE_NAME")
private String fileName;
@OneToOne(mappedBy = "file", cascade = CascadeType.ALL,
fetch = FetchType.LAZY, optional = false)
private FileContent details;
//constructors getters and setters
}
文件内容:
@Entity
@Table(name="FILE_CONTENT", schema="COMMON")
public class FileContent{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
private Long id;
@Column(name = "FILE_NAME")
private String fileName;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "FILE_ID")
private File file;
//constructors getters and setters
}
笔记:
上面的代码片段将创建一个名为
FILE_CONTENT
的表,该表具有一个名为FILE_ID
的列。FILE_ID
是引用FILE.ID
主键的外键。在关联中,
File
实体是父级,而FileContent
是子级。因为外键位于FILE_CONTENT
表中。现在,从您的代码中,您可以从任何侧面访问这两个实体,例如-
file.getFileContent()
或fileContent.getFile()