what is @JoinColumn and how it is used in Hibernate what is @JoinColumn and how it is used in Hibernate postgresql postgresql

what is @JoinColumn and how it is used in Hibernate


A unidirectional association via a join table

@Entityclass Patient {    @OneToMany    private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();}@Entityclass Vehicle {}

A bidirectional association via a join table

@Entityclass Patient {    @OneToMany    private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();}@Entityclass Vehicle {    @ManyToOne(fetch = FetchType.LAZY)    private Patient patient;}

A unidirectional association via a foreign key

@Entityclass Patient {    @OneToMany    @JoinColumn    private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();}@Entityclass Vehicle {}

A bidirectional association via a foreign key

@Entityclass Patient {    @OneToMany(mappedBy = "patient")    private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();}@Entityclass Vehicle {    @ManyToOne(fetch = FetchType.LAZY)    private Patient patient;}

A bidirectional association via a foreign key with a foreign column name specification

@Entityclass Patient {    @OneToMany(mappedBy = "patient")    private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();}@Entityclass Vehicle {    @ManyToOne(fetch = FetchType.LAZY)    @JoinColumn(name="patient_id")    private Patient patient;}

This is the basic starting point of using @JoinColumn.

To verify that the foreign key(patient_id in the Vehicle table) is really mapped in the patients table you can use @JoinColumn(nullable = false)

@Entityclass Vehicle {    @ManyToOne(fetch = FetchType.LAZY)    @JoinColumn(name="patient_id", nullable = false)    private Patient patient}


The join column is declared with the @JoinColumn annotation which looks like the @Column annotation. It has one more parameters named referencedColumnName. This parameter declares the column in the targeted entity that will be used to the join.

In a bidirectional relationship, one of the sides (and only one) has to be the owner: the owner is responsible for the association column(s) update. To declare a side as not responsible for the relationship, the attribute mappedBy is used. mappedBy refers to the property name of the association on the owner side.

Here is Sample code :

EntityOne :     @ManyToOne(fetch = FetchType.LAZY)    @JoinColumn(name = "TEST_ID")    private EntityTwo entityTwo;EntityTwo :       // bi-directional many-to-one association to EntityOne Here TEST_ID is the Primary key    @OneToMany(mappedBy = "entityTwo")    private List<EntityOne> entityOne;


Vehicle Class ---- Entity@JoinColumn(name="patient_id") ---- annotationprivate Patient patient ----field

Above code will generate a column patient_id (a foreign key) in Vehicle class which will point to Patient Class primary key.

MappedBy - This attribute tells us that this relation will be managed by Vehicle class. Example. If we insert a vehicle, then two SQL will be injected if cascadetype is all/save. 1st SQL will inject details in Patient table and 2nd SQL will inject vehicle details in vehicle table with patient_id column of Vehicle column pointing to Patient tuple inserted.