Search code examples
javahibernatejpaormhibernate-mapping

When Should I Use @JoinColumn or @JoinTable with JPA?


@JoinColumn gives an Entity a foreign key to another Entity whereas @JoinTable will list the relationship between all relationships between Entity A and Entity B. As far as I can tell, they both appear to do similar things. When should I use one or the other?


Solution

  • Let's say you have an entity A which has a @ManyToOne association ot an entity B

    @JoinColumn will define the target table Foreign Key (e.g B_ID) while using the target Entity table (e.g. B).

    @Entity
    public class A {
    
        private Long id;
    
        @ManyToOne
        @JoinColumn(name="B_ID")
        private B b;
    
    }
    

    @JoinTable will use a separate table to hold the relationship between A and B.

    @Entity
    public class A {
    
        private Long id;
    
        @ManyToOne
        @JoinTable(
           name = "A_B", 
           joinColumns = @JoinColumn(name = "B_ID"), 
           inverseJoinColumns = @JoinColumn(name = "A_ID")
        )
        private B b;
    
    }
    

    This time neither A nor B contain any Foreign Key, because there's a separate table (e.g. A_B) to hold the association between A and B.