Cómo hacer corresponder una a un solo relación con ninguna clave externa de la APP?

Tony_Ynot:

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 FILEregistro forman la base de datos, pero no de un recién salvado FILEobjeto.

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 Cascadede salvar estas entidades. Cuando accedo a la devolución fileutilizando file.getFileContent();y es nula .

Razib:

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 Filereferencia 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_CONTENTcon una columna llamada FILE_ID.
  • FILE_IDes la clave externa que hace referencia la clave primaria de FILE.ID.

  • Aquí, en la asociación, la Fileentidad es el padre, mientras que el FileContentes el hijo. Debido a que la clave externa se encuentra en la FILE_CONTENTtabla.

  • Ahora desde el código, puede acceder a ambas entidades desde cualquier lado como - file.getFileContent()ofileContent.getFile()

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=236362&siteId=1
Recomendado
Clasificación