JPAでの外部キーを持つ1つのリレーションに1をマッピングする方法?

Tony_Ynot:

私は、次のマッピングと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()を使用します。

だから、私がマップすることができている可能性があり含む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;

}  

で提案されているように私はまた、@MapsIdと@PrimaryKeyJoinColumnてみましたここが、まだ仕事にそれを得ることができません。

何が私が間違っているのでしょうか?

================================================== =================

2019年8月8日に編集されました

答えをRazibのおかげで、それは完璧に働いています。しかし、私は、私が選択したときに、それが働いていることが判明しFILEたレコードは、DBを形成しなく新鮮に保存されてから、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();、それはですヌル

Razib:

あなたが探していることは、1つのマッピングに双方向の一つです。今マッピングは一方向にのみ行われます。双方向のマッピングでは、配置する必要があり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

    } 

含むFileContent:

@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()

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=236356&siteId=1