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

什麼可能會發生任何想法?我不知道爲什麼會發生這種情況,正如你所看到的,我評論了其他行,測試通過可以,但不是當我嘗試更新時,它看起來是另一個對象,或者當對象再次實例化時

謝謝再次給大家


編輯:

的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; 

} 

編輯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只擴展它以提供一些方法,就像你在代碼中看到的一樣,但是現在我沒有更多的方法。在最後一張圖片中,您可以看到拋出異常的方法 –

回答

1

請檢查this 。這個問題與BV無關,而與jpa合併語義和多對多關係有關。

+0

謝謝,你說得對,現在它正在工作 http://stackoverflow.com/questions/1069992/jpa-entitymanager-why-use-persist-over-merge ?LQ = 1 –

相關問題