2011-11-18 113 views
1

我目前停留在以下情况:JPA - 级联问题

当我的JSF - JPA项目启动后的第一次,它自动创建一个管理员用户,并给它的用户类型管理员:

User user = new User(); 
       UserType userType = new UserType(); 
       user.setUsername("admin"); 
       user.setPassword("admin"); 
       userType.setName("admin"); 
       user.setUserType(userType); 
       create(user); 
       return user; 

因此,该代码在数据库中创建用户和用户类型。

然而,当我想我的项目的执行过程中指定的用户类型的用户,我得到一个“事务中止”错误与下面的堆栈跟踪

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504):  org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception:  com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry  'admin' for key 'NAME' 
Error Code: 1062 
Call: INSERT INTO USERTYPE (NAME) VALUES (?) 
bind => [1 parameter bound] 
Query: InsertObjectQuery([email protected]) 

代码看起来像这样

@JoinColumn(nullable=false) 
    @OneToOne(cascade = {CascadeType.PERSIST}) 
    protected UserType userType; 

如果已经尝试了所有其他不同CascadeTypes,但没有他们的支持这两个我想要做的事情......

回答

0

MySQLIntegrityConstraintViolationException:重复录入
“管理员”关键“NAME”错误代码:1062

从这个消息

,我猜你已经在你的用户类型表名称=管理记录?

级联工作正常,因为我们已经看到了insert into usertype声明。

有趣的是为什么user-> usertype是one2one ..通常它会是@ManyToOne。那么它会与你的需求有关,也许你的应用程序需要它是one2one。只是感到奇怪。