I'm trying to understand how JPA is working by making some POC on my own.
I've created some entities, who are something like that :
@Entity
@Table(name = "Employee")
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
@ManyToMany
@JoinTable(name="SKILLS_EMPLOYEES")
private List<Skill> skills;
@ManyToOne
private Company company;
public Employee() {
}
public Employee(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
//[..getters & setters...]
public void addSkill(Skill skill) {
this.skills.add(skill);
skill.addEmployee(this);
}
public void setCompany(Company company) {
this.company = company;
this.company.addEmployee(this);
}
}
@Entity
@Table(name = "Company")
public class Company implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
private String companyName;
private List<Employee> employee;
public Company() {
}
public Company(String companyName) {
this.companyName = companyName;
}
//[..getters & setters...]
public void setEmployee(List<Employee> employee) {
this.employee = employee;
}
public void addEmployee(Employee employee) {
this.employee.add(employee);
}
}
So, a company can have employees, and an employee can have only one company, but in my database, glasshfish created a table between employee and company.
Employee :
Company :
Company_Employee :
What did I do wrong ?
You forgot to tell JPA that company.employees
is the inverse side of employee.company
:
@OneToMany(mappedBy = "company")
private List<Employee> employees;
Note that I added a s
to the name of the field. It's a list of employees, soe there are many of them.