¿Cómo puedo marcar una restricción de clave foránea usando anotaciones de hibernación?


Estoy tratando de usar la anotación de hibernación para escribir una clase modelo para mis tablas de base de datos.

Tengo dos tablas cada una con un Usuario de clave primaria y una Pregunta.

@Entity
@Table(name="USER")
public class User 
{
    @Id
    @Column(name="user_id")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column(name="username")
    private String username;

    // getter and setter
}

Tabla de preguntas.

@Entity
@Table(name="QUESTION")
public class Questions extends BaseEntity{

    @Id
    @Column(name="question_id")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @Column(name="question_text")
    private String question_text;

    // getter and setter

}

Y tengo una tabla más, UserAnswer, que tiene userId y QuestionID como claves foráneas de las dos tablas anteriores.

Pero no puedo encontrar cómo puedo hacer referencia a estas restricciones en la tabla UserAnswer.

@Entity
@Table(name="UserAnswer ")
public class UserAnswer 
{

    @Column(name="user_id")
    private User user;

    //@ManyToMany
    @Column(name="question_id")
    private Questions questions ;

    @Column(name="response")
    private String response;

    //getter and setter 
}

Por favor, ayúdame a lograr esto? Gracias avance.

Author: Scadge, 2013-03-15

3 answers

@Column no es la anotación apropiada. No quieres almacenar un Usuario completo o una pregunta en una columna. Desea crear una asociación entre las entidades. Comience renombrando Questions a Question, ya que una instancia representa una sola pregunta, y no varias. Luego crea la asociación:

@Entity
@Table(name = "UserAnswer")
public class UserAnswer {

    // this entity needs an ID:
    @Id
    @Column(name="useranswer_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

    @ManyToOne
    @JoinColumn(name = "question_id")
    private Question question;

    @Column(name = "response")
    private String response;

    //getter and setter 
}

La documentación de hibernación explica eso. Léelo. Y también leer el javadoc de las anotaciones.

 56
Author: JB Nizet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-15 07:31:36

La anotación @Join column(name="reference_column_name") se puede usar encima de esa propiedad o campo de clase al que se hace referencia desde alguna otra entidad.

 1
Author: Shivam Sugandhi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-27 17:39:07

Hay muchas respuestas y todas son correctas también. Pero desafortunadamente ninguno de ellos explicación clara. Esto también funciona para el mapeo de claves no primarias.

Digamos que tenemos la Tabla Padre-A con la Columna 1 Y otra Tabla-B con la Columna 2 que hace referencia a la Columna 1

@ManyToOne
@JoinColumn(name = "TableBColumn", referencedColumnName = "TableAColumn")
private TableA session_UserName;

introduzca la descripción de la imagen aquí

@ManyToOne
@JoinColumn(name = "bok_aut_id", referencedColumnName = "aut_id")
private Author bok_aut_id;
 0
Author: Vaibhav Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-16 17:16:08