Рекурсивный вызов прослушивателяJAVA

Программисты JAVA общаются здесь
Anonymous
Рекурсивный вызов прослушивателя

Сообщение Anonymous »

При обновлении мой прослушиватель входит в бесконечный цикл; Я испробовал все решения, но не уверен, в чем может быть проблема.

Код: Выделить всё

@Component
public class UserGroupListener implements 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());
}
}
}
это мой прослушиватель

Код: Выделить всё

public class 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;
}
это моя сущность

Код: Выделить всё

public class UserGroupDAOImpl implements 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());
}
}
это мой DAOImpl

Код: Выделить всё

List userGroups = query.getResultList()
находился именно в этом месте; он не переходил на следующую строку, а вместо этого возвращался к @preUpdate в Listener.
Это вызывало некоторые сложности при создании данных для двунаправленных сущностей. получаю ошибку под названием «Общая ссылка».
я использовал

Код: Выделить всё

@Transient
private boolean isUpdating = false;
но это не решило проблему

Подробнее здесь: https://stackoverflow.com/questions/790 ... n-listener

Вернуться в «JAVA»