私は、次のマッピングと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();
、それはですヌル。
あなたが探していることは、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()