/*
 * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package myapp;

import jakarta.persistence.*;

@Entity
@Table(name="EMPLOYEE")
public class Employee implements java.io.Serializable {

    private int	     	     id;
    private String	     firstName;
    private String	     lastName;
    private Department       department;

    public Employee() {
    }

    public Employee(int id, String firstName, String lastName)
    {
        	this.id = id;
        	this.firstName = firstName;
        	this.lastName = lastName;
    }

    public Employee(int id, String firstName, String lastName, 
		    Department department)
    {
        	this.id = id;
        	this.firstName = firstName;
        	this.lastName = lastName;
        	this.department = department;
    }

   // ===========================================================
   // getters and setters for the state fields
    @Id
    @Column(name="ID")
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    @Column(name="FIRSTNAME")
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @Column(name="LASTNAME")
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }


    // ===========================================================
    // getters and setters for the association fields
    // @ManyToOne
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="DEPARTMENT_ID")
    public Department getDepartment() {
        return department;
    }

    @Transient
    public Department getDepartmentNoWeaving() {
        try {
            java.lang.reflect.Field f = Employee.class.getDeclaredField("department");
            return (Department) f.get(this);
        } catch (NoSuchFieldException e) {
            throw new RuntimeException("Please change argument to getDeclaredField", e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    public void setDepartment(Department department) {
        this.department = department;
    }

    public String toString() {
        return "Employee id=" + getId() 
                + ", firstName=" + getFirstName() 
                + ", lastName=" + getLastName() 
                + ", department=" + getDepartment();
    }


}

