Код: Выделить всё
@Setter
@Getter
@Entity
@Table(name = "Task")
@NoArgsConstructor
public class TaskEntity implements AbstractEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "mapName")
private String mapName;
@Column(name = "mapPath")
private String mapPath;
@Column(name = "mapCost")
private String mapCost;
@Column(name = "mapCostResult")
private String mapCostResult;
@Enumerated(EnumType.STRING)
@Column(name = "taskStatus")
private TaskStatus taskStatus;
@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "ticketId")
private TicketEntity ticket;
@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(
name = "Builder_Task",
joinColumns = @JoinColumn(name = "taskId"),
inverseJoinColumns = @JoinColumn(name = "builderDiscordId")
)
private Set builders = new HashSet();
public @NotNull TaskEntity addBuilder(@NotNull BuilderEntity builderEntity) {
builders.add(builderEntity);
return this;
}
public @NotNull TaskEntity removeBuilder(@NotNull BuilderEntity builderEntity) {
builders.remove(builderEntity);
return this;
}
}
Код: Выделить всё
@Setter
@Getter
@Entity
@Table(name = "Ticket")
@NoArgsConstructor
public class TicketEntity implements AbstractEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "channelId", unique = true)
private String channelId;
@Column(name = "creatorName")
private String creatorName;
@Column(name = "creationDate")
@CreationTimestamp
private Timestamp creationDate;
@Column(name = "deadline", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
private Timestamp deadline;
@Column(name = "available")
private boolean available;
@Column(name = "mapsAmount")
private int mapsAmount;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "ticket", cascade = CascadeType.ALL, orphanRemoval = true)
@OrderColumn(name = "ticketId")
private Set tasks = new HashSet();
public @NotNull TicketEntity addTask(@NotNull TaskEntity taskEntity) {
tasks.add(taskEntity);
return this;
}
public @NotNull TicketEntity removeTask(@NotNull TaskEntity taskEntity) {
tasks.remove(taskEntity);
return this;
}
}
Код: Выделить всё
public class TicketRepository implements CRUDRepository {
// Only needed function for question
@Override
public @NotNull TicketEntity update(@NotNull TicketEntity ticketEntity) {
Transaction transaction = null;
try (Session session = HibernateUtil.getSessionFactory().openSession()) {
transaction = session.beginTransaction();
session.merge(ticketEntity);
transaction.commit();
return ticketEntity;
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
throw e;
}
}
}
public class TicketService {
public @NotNull Optional addTask(@NotNull Integer ticketId, @NotNull TaskEntity task) {
return updateTicketEntity(ticketId, ticketEntity -> {
ticketEntity.addTask(task);
task.setTicket(ticketEntity);
});
}
private @NotNull Optional updateTicketEntity(@NotNull Integer ticketId, @NotNull Consumer updater) {
Optional entity = findById(ticketId);
return Preconditions.checkAndReturn(entity.isPresent(),
() -> {
TicketEntity ticketEntity = entity.get();
updater.accept(ticketEntity);
TicketEntity savedEntity = ticketRepository.update(ticketEntity);
ticketCache.put(ticketId, savedEntity);
return Optional.of(savedEntity);
},
Optional::empty);
}
}
< img alt="введите здесь описание изображения" src="https://i.sstatic.net/UD4N811E.png" />
(11 — первое сохранение, 12 — второе). Все, что мне нужно, это сохранить коллекцию, но без дубликатов.
Подробнее здесь: https://stackoverflow.com/questions/792 ... on-problem