2013-09-24 50 views
0

在我的web應用程序中,我在Apache Tomcat(TomEE)/7.0.37服務器上使用OpenJPA。我使用Netbeans自動生成類(「數據庫中的實體類...」和「實體類中的會話Bean ...」)。爲什麼我不能通過openjpa持久化對象? - 錯誤驗證

我User.class:

@Entity 
@Table(name = "USER") 
@XmlRootElement 
@NamedQueries({ 
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u"), 
@NamedQuery(name = "User.findByIdUser", query = "SELECT u FROM User u WHERE u.idUser = :idUser"), 
@NamedQuery(name = "User.findByLogin", query = "SELECT u FROM User u WHERE u.login = :login"), 
@NamedQuery(name = "User.findByPassword", query = "SELECT u FROM User u WHERE u.password = :password")}) 
public class User implements Serializable { 
private static final long serialVersionUID = 1L; 


@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@NotNull 
@Column(name = "id_user") 
private Short idUser; 


@Size(max = 8) 
@Column(name = "login") 
private String login; 
@Size(max = 64) 
@Column(name = "password") 
private String password; 
@JoinTable(name = "USER_has_ROLES", joinColumns = { 
    @JoinColumn(name = "USER_id", referencedColumnName = "id_user")}, inverseJoinColumns = { 
    @JoinColumn(name = "ROLES_id", referencedColumnName = "id_roles")}) 
@ManyToMany 
private List<Roles> rolesList; 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user") 
private List<Lecturer> lecturerList; 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user") 
private List<Student> studentList; 

//constructors, getters, setters 
} 

,當我通過ManagedBean創建新的用戶:

private void addUser() { 
    User user = new User();  
    user.setLogin(registerLog); 
    user.setPassword(registerPass); 
    Roles r = new Roles(); 
    r.setIdRoles(new Short("2")); 
    List<Roles> roleList = new ArrayList<Roles>(); 
    roleList.add(r);   
    user.setRolesList(roleList);  


    userFacade.create(user); //<------here i create by abstract facade by em.persist(user); 

} 

我得到異常:

javax.el.ELException: javax.ejb.EJBException: The bean encountered a non-application exception; nested exception is: javax.validation.ConstraintViolationException: A validation constraint failure occurred for class "model.entity.User". 

viewId=/pages/register.xhtml 
location=/home/jakub/Projekty/Collv2/build/web/pages/register.xhtml 
phaseId=INVOKE_APPLICATION(5) 

Caused by: 
javax.validation.ConstraintViolationException - A validation constraint failure occurred for class "model.entity.User". 
at org.apache.openjpa.persistence.validation.ValidatorImpl.validate(ValidatorImpl.java:282) 

/pages/register.xhtml at line 26 and column 104 action="#{registerController.register}" 

它看起來像我我的用戶名不相關克拉。哪裏不對 ?

+0

找出它是哪個約束呢?做一些像'User'一個接一個地去除屬性(除了'Id')然後看看哪一個讓錯誤消失。 – millimoose

+0

我試了一下,我知道必須是'@NotNull'註釋,因爲當我刪除它並調試它的代碼時,'em.persist(user)'不會停止',但是在那之後我得到異常:'javax .el.E​​LException:javax.ejb.EJBTransactionRolledbackException:事務回滾,大概是因爲使用setRollbackOnly是synchronization'在數據庫中調用我還沒有關於添加用戶 – kuba44

+0

任何信息是,所有的輸出你得到?應該有什麼地方以及... – millimoose

回答

1

我覺得你的問題是你的ID生成類型 - GenerationType.IDENTITY。通常,在使用標識時,會使用特殊的數據庫列來生成標識。直到數據被插入到數據庫中後纔會生成id,直到提交之後,該id本身才可用於實體。但是,Bean驗證使用實體的當前狀態在預留持久回調上發生。這將失敗,因爲ID仍然是null

我大概只是​​改變了一代類型。

+0

我嘗試每一代生成策略('GenerationType.AUTO,GenerationType.IDENTITY,GenerationType.SEQUENCE'和'GenerationType.TABLE'),但每當我得到相同的異常時:'javax.el.E​​LException:javax.ejb.EJBException:該bean遇到了非應用程序異常;嵌套異常是:javax.validation.ConstraintViolationException:類「model.entity.User」發生驗證約束失敗。' – kuba44

+0

當我刪除'@ NotNull'註釋並設置'GenerationType.IDENTITY'我得到'javax.ejb.EJBTransactionRolledbackException '。當我設置'GenerationType.AUTO','GenerationType.SEQUENCE'或'GenerationType.TABLE'它可以工作,但你認爲我可以刪除'@NotNull'註釋嗎? – kuba44

0

我不會做這樣的:

Roles r = new Roles(); 
r.setIdRoles(new Short("2")); 
List<Roles> roleList = new ArrayList<Roles>(); 
roleList.add(r);  

這基本上是一個誤用,如果這個角色存在,並能鏈接到你創建,你應該檢索和設置;否則,如果你想創建一個新的角色,不要爲它設置@Id,否則會導致錯誤,因爲OpenJPA將查找現有的項目而不是創建新的項目。

而且,是的,這可能是您的錯誤的原因。修復是檢索角色或只是不設置@Id屬性。另外,.setIdRoles()命名對我來說很奇怪。

+0

好的,我將上面的代碼改爲:'Roles r = rolesFacade.find(new Short(「2 「)); List roleList = new ArrayList (); roleList.add(r); user.setRolesList(roleList);'但它不能解決我的問題。再次,我與@NotNull('javax.el.E​​LException:javax.ejb.EJBException:該Bean遇到了一個非應用程序異常;嵌套的異常是:javax.validation.ConstraintViolationException:類的驗證約束失敗發生了同樣的異常。 ..')和無('javax.el.E​​LException:javax.ejb.EJBTransactionRolledbackException ...') – kuba44

相關問題