Проблема пересечения зависимостей, когда Модель и Репозиторий находятся в разных проектах - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть объект Заимствование, теперь я хочу сделать резервную копию заимствования при добавлении новой записи в таблицу 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;
}
...