Tengo 2 entidades con el siguiente mapeo
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;
}
y 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;
}
Hasta ahora, este mapeo se trabaja bien como puedo conseguir archivos usando fileContent.getDocFile ().
Entonces, ¿es posible que pueda mapear el fileContent dentro del archivo también? He intentado añadir el mapeo de esta manera, pero no está funcionando, siempre conseguir nula cuando accedo usando file.getFileContent ();
@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;
}
También probé con @MapsId y @PrimaryKeyJoinColumn como se sugiere en aquí , pero todavía no es capaz de conseguir que funcione.
¿Qué estoy haciendo mal?
================================================== =================
Editado el 08/08/2019
Gracias por Razib por la respuesta, y que está funcionando perfectamente. Sin embargo, encontramos que está funcionando cuando selecciono el FILE
registro forman la base de datos, pero no de un recién salvado FILE
objeto.
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;
No estoy usando el Cascade
de salvar estas entidades. Cuando accedo a la devolución file
utilizando file.getFileContent();
y es nula .
Lo que se busca es una bidireccional a uno de mapeo. Ahora, la transformación se realiza de una sola manera. En el mapeo bidireccional, es necesario poner File
referencia en FileContent
, y viceversa. Compruebe el siguiente fragmento de código -
Archivo:
@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
}
notas:
- El fragmento de código anterior creará la tabla denominada
FILE_CONTENT
con una columna llamadaFILE_ID
. FILE_ID
es la clave externa que hace referencia la clave primaria deFILE.ID
.Aquí, en la asociación, la
File
entidad es el padre, mientras que elFileContent
es el hijo. Debido a que la clave externa se encuentra en laFILE_CONTENT
tabla.Ahora desde el código, puede acceder a ambas entidades desde cualquier lado como -
file.getFileContent()
ofileContent.getFile()