2013-09-24 30 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

相关问题