Estoy creando una aplicación que utiliza una relación de muchos a muchos entre empleados y turnos. Sin embargo, tengo dificultades para entender cómo puedo asignar/conectar a un empleado a un turno.
@Data @Entity public class Employee { private @Id @GeneratedValue long employeeID; private String Name; @OneToMany(cascade = CascadeType.ALL) private Set<Shift> shifts; private Employee() { } public Employee(long employeeID, String Name) { this.employeeID = employeeID; this.Name = Name; } public Employee(long employeeID, String Name, Set<Shift> shifts) { this.employeeID = employeeID; this.Name = Name; this.shifts = shifts; } public void setShift(Set<Shift> shifts) { this.shifts = (Set<Shift>) shifts; }}
@Data @Entity public class Shift { private @Id @GeneratedValue long Id; private String shifts; private Set<Employee> employee; private Shift() { } public Shift(String shifts) { this.shifts = shifts; } public Shift(String shiftPeriod,Set<Employee> employee ) { this.shifts = shifts; this.employee=employee; } public void setEmployee(Set<Employee> employee) { this.employee = employee; }}
@Component public class DatabaseLoader implements CommandLineRunner { private final EmployeeRepository repository; @Autowired public DatabaseLoader(EmployeeRepository repository) { this.repository = repository; } @Override public void run(String... strings) throws Exception { Shift shift = new Shift("Friday Morning"); Employee employee = new Employee(0001, "Adam Smith"); employee.setShift(shift); this.repository.save(employee); }}
public interface ShiftRepository extends CrudRepository<Shift, Long> public interface EmployeeRepository extends CrudRepository<Employee, Long>Las entidades agregadas a los empleados y los turnos se guardan, pero ¿hay alguna manera de asignar un turno a un empleado en la clase DatabaseLoader, ya que me he quedado atascado en encontrar una solución para esto?
Sé que no he incluido un método que intente conectar el empleado y los turnos, pero no sé cómo abordar este problema.
Gracias por adelantado
**EDITAR: El nuevo problema que tengo ahora es que recibo el siguiente mensaje cuando intento implementar en primavera:
No se pudo construir Hibernate SessionFactory: no se pudo determinar el tipo para: java.util.Set, en la tabla: turno, para las columnas: [org.hibernate.mapping.Column(empleado)]
Parece que está usando Hibernate debajo del capó, entonces todo lo que tiene que hacer es configurar los objetos que desea guardar correctamente, así:
@Component public class DatabaseLoader implements CommandLineRunner { private final EmployeeRepository repository; private final ShiftRepository shiftRepository; @Autowired public DatabaseLoader(EmployeeRepository repository, ShiftRepository shiftRepository) { this.repository = repository; this.shiftRepository=shiftRepository; } @Override public void run(String... strings) throws Exception { Shift shift = new Shift("Friday Morning"); Employee employee = new Employee(0001, "Adam Smith"); employee.setShift(shift) this.repository.save(employee); }La única diferencia es que adjunto entre los dos objetos y solo entonces trato de guardarlos. Vale la pena mencionar que es importante usar Cascade.All o Cascade.persiste para que hibernate haga las inserciones en ambas entidades.
En mi opinión:
Un turno es una entidad independiente. No depende de ningún empleado. Entonces Shift no debe tener una referencia a Employee .
Por otro lado, un empleado depende de varios turnos, por lo que el Employee debe tener una asociación unidireccional @OneToMany con Shift .
@OneToMany private List<Shift> shifts;Employee y Shift son entidades independientes.ACTUALIZAR
Para "agregar un turno a un empleado" podemos usar, por ejemplo, un setter de Employee :
@Entity public class Employee { //... private String name; //... @OneToMany private List<Shift> shifts; //... public Employee(String name) { this.name = name; } //... public setShifts(Shift... shifts) { this.shifts = Arrays.asList(shifts); } //... }entonces
Shift monday = shiftRepository.save(new Shift("Monday")); Shift friday = shiftRepository.save(new Shift("Friday")); Employee adamSmith = new Employee("Adam Smith"); adamSmith.setShifts(monday, friday); employeeRepository.save(adamSmith);