Team.java

package com.ibanfr.domain.model;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;
import java.util.List;
import java.util.Objects;

@Table(name = "team")
@Entity
@Getter
@ToString
public class Team extends DomainEntity implements Serializable {

    private static final long serialVersionUID = -6197675373768898713L;

    @Column
    private String name;

    /**
     * OneToMany association with {@link Employee} entity mapped as a List.
     * <p>
     * Defining {@link CascadeType#ALL} for the associated {@link Employee} entity.
     * <p>
     * Defining orphanRemoval to cascade the remove operation to entities that have been removed from the
     * relationship.
     * <p>
     * Using {@link JoinColumn} to implement unidirectional one-to-many association using a foreign key mapping.
     * <p>
     * Specifying {@link ForeignKey} name to avoid using the persistence provider's default foreign key strategy.
     *
     */
    @Setter
    @OneToMany(orphanRemoval = true, cascade = CascadeType.ALL)
    @JoinColumn(name = "team_id", foreignKey = @ForeignKey(name = "FK_user_team_id"))
    private List<Employee> members;

    /**
     * Empty constructor required by hibernate
     */
    protected Team(){
    }

    private Team(String name) {
        Objects.requireNonNull(name);
        this.name = name;
    }

    public static Team of(String name) {
        return new Team(name);
    }
}