The following code shows how to map a Collection with target entity to database.
// Using a targetClass instead of generics @ElementCollection(targetClass=VacationEntry.class) @CollectionTable(name="VACATION",joinColumns=@JoinColumn(name="EMP_ID")) @AttributeOverride(name="daysTaken",column=@Column(name="DAYS_ABS")) private Collection vacationBookings = new LinkedList();
The following code is from Employee.java.
package com.java2s.common; import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; import java.util.Set; import javax.persistence.AttributeOverride; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; @Entity public class Employee { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; private String name; // Using a targetClass instead of generics @ElementCollection(targetClass=VacationEntry.class) @CollectionTable(name="VACATION", joinColumns=@JoinColumn(name="EMP_ID")) @AttributeOverride(name="daysTaken", column=@Column(name="DAYS_ABS")) private Collection vacationBookings = new LinkedList(); // Using generics in place of a targetClass @ElementCollection @Column(name="NICKNAME") private Set<String> nickNames = new HashSet(); public Collection getVacationBookings() { return vacationBookings; } public void setVacationBookings(Collection vacationBookings) { this.vacationBookings = vacationBookings; } public Set<String> getNickNames() { return nickNames; } public void setNickNames(Set<String> nickNames) { this.nickNames = nickNames; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return "Employee id: " + getId() + " name: " + getName() + " nickNames: " + nickNames; } }
The following code is from PersonDaoImpl.java.
package com.java2s.common; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.transaction.annotation.Transactional; @Transactional public class PersonDaoImpl { public void test() { Employee emp = new Employee(); emp.setName("name"); VacationEntry v = new VacationEntry(); v.setDaysTaken(10); emp.getVacationBookings().add(v); emp.getNickNames().add("Tester"); em.persist(emp); } @PersistenceContext private EntityManager em; }
The following code is from VacationEntry.java.
package com.java2s.common; import java.util.Calendar; import javax.persistence.Column; import javax.persistence.Embeddable; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Embeddable public class VacationEntry { @Temporal(TemporalType.DATE) private Calendar startDate; @Column(name="DAYS") private int daysTaken; public VacationEntry() {} public VacationEntry(Calendar aStartDate, int daysTakenInt) { startDate = aStartDate; daysTaken = daysTakenInt; } public Calendar getStartDate() { return startDate; } public void setStartDate(Calendar startDate) { this.startDate = startDate; } public int getDaysTaken() { return daysTaken; } public void setDaysTaken(int daysTaken) { this.daysTaken = daysTaken; } public String toString() { return "VacationEntry startDate: " + getStartDate().getTime() + ", daysTaken: " + getDaysTaken(); } }
The following is the database dump.
Table Name: EMPLOYEE Row: Column Name: ID, Column Type: INTEGER: Column Value: 1 Column Name: NAME, Column Type: VARCHAR: Column Value: name Table Name: EMPLOYEE_NICKNAMES Row: Column Name: EMPLOYEE_ID, Column Type: INTEGER: Column Value: 1 Column Name: NICKNAME, Column Type: VARCHAR: Column Value: Tester Table Name: VACATION Row: Column Name: EMP_ID, Column Type: INTEGER: Column Value: 1 Column Name: DAYS_ABS, Column Type: INTEGER: Column Value: 10 Column Name: STARTDATE, Column Type: DATE: Column Value: null