Search code examples
mysqljakarta-eejpaglassfish-3netbeans-8

Java EE with JPA, strange database generated


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 :

  • ID
  • FIRSTNAME
  • LASTNAME
  • COMPANY_ID

Company :

  • ID
  • COMPANYNAME

Company_Employee :

  • Company_ID
  • Employee_ID

What did I do wrong ?


Solution

  • 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.