@ElementCollection is new annotation introduced in JPA 2.0, This will help us get rid of One-Many and Many-One shitty syntax.
Example 1: Stores list of Strings in an Entity
@Entity
public class Users implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ElementCollection
private List<String> certifications = new ArrayList<String> ();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public List <String> getCertifications() {
return certifications;
}
public void setCertifications(List <String> certifications) {
this.certifications = certifications;
}
..
}
Users u = new Users();
u.getCertifications().add("Sun Certified Java Programmer");
em.persist(u);
Generated Tables
Users
Column --> ID
Row 1
Users_CERTIFICATIONS
Column Users_ID CERTIFICATIONS
Row 1 Sun Certified Java Programmer
@ElementCollection rules
@Embeddable
public class Certification {
@Column(name = "name")
private String name;
@Temporal(TemporalType.DATE)
@Column(name = "issue_date")
private Date issueDate;
public Date getIssueDate() {
return issueDate;
}
public void setIssueDate(Date issueDate) {
this.issueDate = issueDate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity
public class Users implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ElementCollection
@CollectionTable(name = "Certification", joinColumns = {@JoinColumn(name="user_id")})
private List<Certification> certifications = new ArrayList<Certification>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public List <Certification> getCertifications() {
return certifications;
}
public void setCertifications(List <Certification> certifications) {
this.certifications = certifications;
}
..
}
Users u = new Users();
Certification c = new Certification();
c.setName("Sun Certified Java Programmer");
c.setIssueDate(new Date());
u.getCertifications().add(c);
em.persist(u);
Resulted Table structure
Table --> Users
Column --> ID
Row 1
Table --> Users_Certification
Column user_id name Issue_Date
Row 1 Sun Certified Java Programmer 2010-09-05
Example 1: Stores list of Strings in an Entity
@Entity
public class Users implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ElementCollection
private List<String> certifications = new ArrayList<String> ();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public List <String> getCertifications() {
return certifications;
}
public void setCertifications(List <String> certifications) {
this.certifications = certifications;
}
..
}
Users u = new Users();
u.getCertifications().add("Sun Certified Java Programmer");
em.persist(u);
Generated Tables
Users
Column --> ID
Row 1
Users_CERTIFICATIONS
Column Users_ID CERTIFICATIONS
Row 1 Sun Certified Java Programmer
@ElementCollection rules
- This annotation was introduced to map basic and embedded type objects
- You can use any collection of type Collection, List, Set, Map
- Its easy to override default values for generated Tables and Columns
- JPA 1.0 only supported collection holding entity types using (@ManyToOne, @OneToMany) annotations
@Embeddable
public class Certification {
@Column(name = "name")
private String name;
@Temporal(TemporalType.DATE)
@Column(name = "issue_date")
private Date issueDate;
public Date getIssueDate() {
return issueDate;
}
public void setIssueDate(Date issueDate) {
this.issueDate = issueDate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity
public class Users implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ElementCollection
@CollectionTable(name = "Certification", joinColumns = {@JoinColumn(name="user_id")})
private List<Certification> certifications = new ArrayList<Certification>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public List <Certification> getCertifications() {
return certifications;
}
public void setCertifications(List <Certification> certifications) {
this.certifications = certifications;
}
..
}
Users u = new Users();
Certification c = new Certification();
c.setName("Sun Certified Java Programmer");
c.setIssueDate(new Date());
u.getCertifications().add(c);
em.persist(u);
Resulted Table structure
Table --> Users
Column --> ID
Row 1
Table --> Users_Certification
Column user_id name Issue_Date
Row 1 Sun Certified Java Programmer 2010-09-05