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.