One-To-Many Relationship in Spring Data JPA
@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
.
Justin
Updated on June 05, 2022Comments
-
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 over 6 years@v.ladynav's answer :)
-
Justin over 6 yearsI'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/HibernateJpaAutoConfiguration.class]: 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 over 6 yearsI'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/HibernateJpaAutoConfiguration.class]: 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 over 6 yearsCaused by: java.sql.SQLException: Cannot add foreign key constraint
-
Justin over 6 yearsCaused by: java.sql.SQLException: Cannot add foreign key constraint
-
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 over 6 yearsI 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 over 6 years@Justin Try to set a join column name
@JoinColumn("consumer_id")
. Also check other column names. -
Justin over 6 yearsThat 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