我有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()

07-24 20:11