@Component
публичный класс UserGroupListener реализует ApplicationContextAware {
Код: Выделить всё
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
UserGroupListener.applicationContext = applicationContext;
}
@PreUpdate
public void preUpdate(UserGroup userGroup) {
if (userGroup.getId() == null ) {
throw new CommonException("Group ID is mandatory");
}
checkIdExists(userGroup);
checkForDuplicateGroupName(userGroup);
}
private void checkForDuplicateGroupName(UserGroup userGroup) {
try {
UserGroupDTO filter = new UserGroupDTO();
filter.setGroupName(userGroup.getGroupName().toLowerCase());
UserGroupService userGroupService = applicationContext.getBean(UserGroupService.class);
List duplicates = userGroupService.get(filter);
duplicates.removeIf(x -> x.getId().equals(userGroup.getId()));
System.out.println("duplicates: " + duplicates);
if (!duplicates.isEmpty()) {
throw new CommonException("Group name already exists");
}
} catch (Exception e) {
throw new CommonException(e.getMessage());
}
}
private void checkIdExists(UserGroup userGroup) {
try {
UserGroupDTO filter = new UserGroupDTO();
filter.setId(userGroup.getId());
UserGroupService userGroupService = applicationContext.getBean(UserGroupService.class);
List userGroups = userGroupService.get(filter);
if (userGroups.isEmpty()) {
throw new CommonException("Group ID not found");
}
}catch (Exception e){
throw new CommonException(e.getMessage());
}
}
публичный класс UserGroup {
Код: Выделить всё
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", nullable = false, unique = true)
private String groupName;
@Column(name = "description",length = 1025)
private String groupDescription;
@Column(name = "qualified_name")
private String qualifiedName;
@ManyToOne
@JoinColumn(name = "parent_id")
private UserGroup parentGroup;
@OneToMany(mappedBy = "parentGroup", cascade = CascadeType.ALL)
private Set childGroups;
это моя сущность
публичный класс UserGroupDAOImpl реализует UserGroupDAO {
Код: Выделить всё
@PersistenceContext
private EntityManager entityManager;
private final UserGroupMapper mapper;
public List get(UserGroupDTO userGroupDTO) {
try {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(UserGroup.class);
Root root = criteriaQuery.from(UserGroup.class);
List
predicates = buildPredicates(userGroupDTO, criteriaBuilder, root);
criteriaQuery.where(predicates.toArray(new Predicate[0]));
TypedQuery query = entityManager.createQuery(criteriaQuery);
// Apply pagination
PaginationUtil.applyPagination(query, userGroupDTO);
List userGroups = query.getResultList();
return mapper.map(userGroups);
} catch (Exception e) {
throw new CommonException(e.getMessage());
}
}
Список userGroups = query.getResultList() находился именно в этом месте; он не переходил на следующую строку, а вместо этого возвращался к @preUpdate to Listener.
Это вызывало некоторые сложности при создании данных для двунаправленных сущностей. получаю ошибку под названием Общая ссылка.
я использовал
@Transient
частное логическое значение isUpdating = false;
но это не так решение проблемы
Подробнее здесь: https://stackoverflow.com/questions/790 ... n-listener