One-To-Many Relationship in Spring Data JPA

13,299
@Entity
public class Consumer {

    @OneToMany(mappedBy = "consumer")
    private List<Policy> policies;

}

@Entity
public class Policy {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn("consumer_id")
    private Consumer consumer;

}

fetch = FetchType.LAZY is not necessary, but desirable.

I have provided some basics here

what is @JoinColumn and how it is used in Hibernate

If you want to a Policy don't have a Consumer:

You can use a join table

@Entity
public class Consumer {

    @OneToMany
    private List<Policy> policies;

}

@Entity
public class Policy {
    
}

A unidirectional relation (a Policy table will have consumer_id column, but a Policy class doesn't have a Consumer)

@Entity
public class Consumer {

    @OneToMany
    @JoinColumn("consumer_id")
    private List<Policy> policies;

}

@Entity
public class Policy {
    
}

Also, keep in mind, that if you want to use a Policy as tabular data (from a dictionary) you will need @ManyToMany.

Share:
13,299
Justin
Author by

Justin

Updated on June 05, 2022

Comments

  • Justin
    Justin almost 2 years

    I would like to have a One-to-many relationship between 2 Entities, Consumer and Policy. One consumer should have several policies.

    This is an example of a Consumer JSON object I would like to have:

    {
         id : 1,
         name : "Peter",
         endpoint: "123.456.778",
         policies: [
                        {
                           id : 1,
                           name: "policy 01"
                        },
                        {
                           id : 2,
                           name: "policy 02"
                        }
                 ]
    }
    

    This is what I have so far:

    Policy Entity

    @Entity
    public class Policy {
            @Id
            @GeneratedValue
            @Column(name = "id")
            private Integer id;
    
            @Column(name = "name")
            private String name;
    
            //getters and setters
        }
    

    Consumer Entity

    @Entity
    public class Consumer {
    
        @Id
        @GeneratedValue
        @Column(name = "consumer_id")
        private Integer id;
    
        @Column(name = "name")
        private String name;
    
        @Column(name = "endpoint")
        private String endpoint;
    
        @OneToMany
        @JoinColumn(??)
        private List<Policy> policies;
    
      //getters and setters
    }
    

    It's not that hard I think, but im trying now for several hours and can't get it done. I'm new to Spring, so if someone is able to help me, I would be very thankfull!

  • Abdullah Khan
    Abdullah Khan over 6 years
    @v.ladynav's answer :)
  • Justin
    Justin over 6 years
    I'm getting a Error: "org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpa‌​AutoConfiguration.cl‌​ass]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory" "Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory"
  • Justin
    Justin over 6 years
    I'm getting a Error: "org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpa‌​‌​AutoConfiguration.‌​cl‌​ass]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory" "Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
  • Justin
    Justin over 6 years
    Caused by: java.sql.SQLException: Cannot add foreign key constraint
  • Justin
    Justin over 6 years
    Caused by: java.sql.SQLException: Cannot add foreign key constraint
  • v.ladynev
    v.ladynev over 6 years
    @Justin You need to carefully check an existing database schema and, probably, delete illegal constraints. Hibernate created them for your previous variants.
  • Justin
    Justin over 6 years
    I just connected to a new Database, but I'm confronting following error: "Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: com.policyMgmt.policy.Policy column: id (should be mapped with insert="false" update="false")"
  • v.ladynev
    v.ladynev over 6 years
    @Justin Try to set a join column name @JoinColumn("consumer_id"). Also check other column names.
  • Justin
    Justin over 6 years
    That worked! Thanks! But this is not really what I wanted. A consumer should have several Polcies, but a Policy should't have a Consumer. How can I handle this? I can't just remove the @ManyToOne