У меня есть объект Заимствование, теперь я хочу сделать резервную копию заимствования при добавлении новой записи в таблицу BorrowingHistory с помощью BorrowingEntityListeners. Проблема заключается в том, что слушатель должен использовать хранилище для сохранения информации в БД, это означает, чтоСущность Borrowing и BorrowingHistory должна зависеть от модуля Repository.Но модуль Repository зависит уже от модуля Model, нет?Это проблема перекрестных зависимостей.
Знаете ли вы, как ее решить?
Должен ли я объединить модель и репозиторий в один модуль?
public enum Action {
INSERTED("INSERTED"),
UPDATED("UPDATED"),
DELETED("DELETED");
private final String name;
private Action(String value) {
this.name = value;
}
public String value() {
return this.name;
}
@Override
public String toString() {
return name;
}
}
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Auditable<U> {
@CreatedBy
protected U createdBy;
@CreatedDate
protected LocalDateTime createdDateTime;
@LastModifiedBy
protected U lastModifiedBy;
@LastModifiedDate
protected LocalDateTime lastModifiedDateTime;
}
@Service
public class BeanUtil implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext
applicationContext) throws BeansException {
context = applicationContext;
}
public static <T> T getBean(Class<T> beanClass) {
return context.getBean(beanClass);
}
}
public class BorrowingEntityListener {
@PostPersist
public void prePersist(Borrowing target) {
perform(target, Action.INSERTED);
}
@PreUpdate
public void preUpdate(Borrowing target) {
perform(target, Action.UPDATED);
}
@PreRemove
public void preRemove(Borrowing target) {
perform(target, Action.DELETED);
}
@Transactional(MANDATORY)
void perform(Borrowing target, Action action) {
BorrowingHistoryRepository borrowingHistoryRepository = BeanUtil.getBean(BorrowingHistoryRepository.class);
borrowingHistoryRepository.save(new BorrowingHistory(target, action));
}
}
@Entity
@EntityListeners(BorrowingEntityListener.class)
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Getter @Setter
public class Borrowing extends Auditable<String> {
...
}
@Entity
@EntityListeners(BorrowingEntityListener.class)
public class BorrowingHistory {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@ManyToOne
@JoinColumn(name = "borrowing_id", foreignKey = @ForeignKey(name = "FK_borrowing_history_borrowing"))
private Borrowing borrowing;
private String borrowingContent;
@CreatedBy
private String modifiedBy;
@CreatedDate
private LocalDateTime modifiedDateTime;
@Enumerated(STRING)
private Action action;
}