Идеологически из структуры RMDB лучше создать таблицу связей между пользователем и командой.
пользователь
@Entity
@Table(name = "user")
public class User {
@Id
@Column(name = "email", length = 200) //@Id controls nullable and unique
private String email;
@Column(name = "name", nullable = false, length = 200)
private String name;
@Column(name = "password", nullable = false, length = 128)
@JsonIgnore
private String password;
@Column(name = "avatar", nullable = true)
private String avatar;
@ManyToMany(cascade = CascadeType.ALL) //by default fetch - LAZY
@JoinTable(name = "user_team", joinColumn = @JoinColumn(name = "user_id",
foreignKey = @ForeignKey(name = "fk_user_team__user"), nullable = false),
inverseJoinColumns = @JoinColumn(name = "team_id",
foreignKey = @ForeignKey(name = "fk_user_team_team"), nullable = false))
private Set<Team> teams;
}
команда
@Entity
@Table(name = "team")
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
@Column
private String url;
@Lob
@Column(name = "avatar", nullable = true, columnDefinition = "BLOB")
private String avatar;
@ManyToMany(cascade = CascadeType.ALL) //by default fetch - LAZY
@JoinTable(name = "user_team", joinColumn = @JoinColumn(name = "team_id",
foreignKey = @ForeignKey(name = "fk_user_team__team"), nullable = false),
inverseJoinColumns = @JoinColumn(name = "user_id",
foreignKey = @ForeignKey(name = "fk_user_team_user"), nullable = false))
private Set<User> users;
}
UserTeam
@Entity
@Table(name = "user_team", uniqueConstraints =
@UniqueConstraints(columnNames = {"user_id", "team_id"}, name = "uniq_some")
public class UserTeam {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; //it's easier to create new Long Id key then composite key with user_id and team_id
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id", foreignKey = @ForeignKey(name = "fk_user_team__user"), nullable = false)
private User user;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "team_id", foreignKey = @ForeignKey(name = "fk_user_team__team"), nullable = false)
private Team team;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "role_id", nullable = false) //I don't see Role entity but think it has id field
@JsonIgnore
private Role role;
}
С этой структурой вы можете получить всех пользователей для Команды и всех команд для Пользователя. Коллекции ленивы, поэтому вам нужно использовать @Transactional, например, для соответствующих методов обслуживания.
И эта структура является двунаправленной: если вы добавите нового пользователя в коллекцию пользователей в объекте Team, JPA создаст нового пользователя , Но ... таблица связей содержит еще одно обязательное поле role_id
, поэтому при таком добавлении вы получите исключение. Поэтому лучше сначала создать объекты User и Team, а затем создать объект связывания UserTeam с требуемой ролью (или установить роль по умолчанию, и все новые объекты будут созданы с этой ролью).