1

прежде всего спасибо за все, кто пытается помочь мне с этим: Я пытаюсь проверить список с, по меньшей мере, один элементом, если я проверю с помощьюВалидатор, получающий нулевые объекты ¿Почему?

Set<ConstraintViolation<Object>> constraintViolations = VALIDATOR.validate(anObj); 

Ограничения работает отлично, но когда я пытаюсь упорствовать, объект с одним элементом пройти снова и список пустой ...

Это часть класса со списком:

public class Team implements Serializable { 
//... 
@AtLeastOneNotNull 
@ManyToMany 
@JoinTable(
    name="teams_players" 
    , joinColumns={ 
     @JoinColumn(name="id_team") 
     } 
    , inverseJoinColumns={ 
     @JoinColumn(name="id_player") 
     } 
    ) 
private List<Player> players; 
//... 
} 

валидатор:

public class AtLeastOneNotNullValidator implements ConstraintValidator<AtLeastOneNotNull, List<?>> { 

@Override 
public void initialize(AtLeastOneNotNull constraint) { 

} 

@Override 
public boolean isValid(List<?> aCollection, ConstraintValidatorContext aConstraintValidatorContext) { 
    if(aCollection == null || aCollection.isEmpty()) 
     return false; 
    else 
     return true; 
} 
} 

Аннотация:

@Target({ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Constraint(validatedBy = AtLeastOneNotNullValidator.class) 
public @interface AtLeastOneNotNull { 

String message() default "{[ERROR] Collection must have at least one element}"; 

Class<?>[] groups() default {}; 

Class<? extends Payload>[] payload() default {}; 

} 

Класс испытаний:

public class TeamDAOTest { 

private static Validator VALIDATOR; 

TeamTestHelper teamTestHelper = null; 
TeamDAO teamDaoTest = null; 

@Before 
public void initTestClass() { 
    teamDaoTest = new TeamDAO(); 
    teamTestHelper = new TeamTestHelper(); 
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
    VALIDATOR = factory.getValidator(); 
} 

@After 
public void endTestClass() { 

} 

@Test 
public void savingRightTeam() { 
    Team testTeam = teamTestHelper.getTeamOK(); 

//  Set<ConstraintViolation<Team>> constraintViolations = VALIDATOR.validate(testTeam); 
//  
//  assertEquals(0, constraintViolations.size()); 
//    
    assertEquals("Inserting right Team", true, teamDaoTest.updateEntity(testTeam)); 
} 

@Test 
public void savingWrongTeam() { 
    Team testTeam = teamTestHelper.getTeamKO_WithoutPlayers(); 

//  Set<ConstraintViolation<Team>> constraintViolations = VALIDATOR.validate(testTeam); 
//  
//  assertEquals(1, constraintViolations.size()); 

    assertEquals("Inserting empty Team", false, teamDaoTest.updateEntity(testTeam)); 
} 

}

И, наконец, это то, что происходит, когда я запускаю этот

Прежде всего, вы можете см. команду, созданную с помощью списка с одним элементом. Примечание: Помощник создает игрока и сохраняет его в первую очередь, затем добавляет команду и возвращает ее, и это команда, которую мы можем видеть. enter image description here

На втором этапе, когда он пытается сохранить элемент и проходит через валидатор, список пуст ... ¿почему?

enter image description here

И, наконец, конечно же, с нулевой список, метод слияния бросает исключение:

enter image description here

Любая идея о том, что могло случиться? Я не знаю, почему это происходит, как вы можете видеть, я прокомментировал другие строки, тест прошел нормально, но не тогда, когда я пытаюсь обновить, это похоже на другой объект или как объект снова создается снова.

Спасибо снова всем


EDIT:

getPlayer() и addPlayer() методы в объекте команды:

public List<Player> getPlayers() { 
    if(this.players == null) 
     this.players = new ArrayList<Player>(); 

    return this.players; 
} 

public boolean addPlayer(Player aPlayer){ 
    if(!getPlayers().contains(aPlayer)){ 
     this.players.add(aPlayer); 
     return true; 
    } 
    else return false; 

} 

Edit 2: DAO, как вы можете видеть, теперь мне не нужно более конкретные методы в TeamDAO

public class TeamDAO extends AbstractDAOLayer<Team> { 

}

метод UpdateEntity в AbstractDAOLayer

public boolean updateEntity(T anObject){ 
    try{ 
     this.beginTransaction(); 
     this.entityManager.merge(anObject); 
     this.finishtTransaction(); 
     return true; 
    } 
    catch(Exception e){ 
     return false; 
    } 
} 
+0

Не могли бы вы выслать код для TeamDAO.updateEntity? – Franck

+0

Конечно, я добавил в последнем выпуске. Уровень DAO является абстрактным классом, TeamDAO только расширяет его, чтобы предоставить некоторые методы, как вы можете видеть в коде, но к настоящему времени у меня больше нет методов. На последнем изображении вы можете увидеть метод с Exception thrown –

ответ

1

Пожалуйста, проверьте this ,Проблема не имеет ничего общего с BV, а скорее с семантикой jpa merge с отношением «многие ко многим».

+0

Спасибо, вы были правы, теперь он работает http://stackoverflow.com/questions/1069992/jpa-entitymanager-why-use-persist-over-merge ? LQ = 1 –

Смежные вопросы