2010-11-17 8 views
0

这是代码:级联的持久性未能产生一个新的实体,为什么主键?

@Entity 
public class Dept { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 
    @OneToMany(
    mappedBy = "dept", 
    cascade = CascadeType.ALL 
) 
    private List<Employee> employees = new ArrayList<Employee>(); 
    public void addEmployee(Employee emp) { 
    this.employees.add(emp); 
    } 
} 

@Entity 
public class Employee { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 
    @Column private Integer age; 
    public Employee(Integer a) { 
    this.age = a; 
    } 
} 

然后在单元测试我这样做(OpenJPA的使用):

// ... 
Dept dept = new Dept(); 
dept.addEmployee(new Employee(25)); 
this.em.persist(dept); 

OpenJPA的说:

Caused by: <openjpa-1.2.1-r752877:753278 nonfatal general error> 
org.apache.openjpa.persistence.PersistenceException: Attempt to insert 
null into a non-nullable column: column: ID table: EMPLOYEE in 
statement [INSERT INTO employee (age) VALUES (?)] 
{prepstmnt 841687127 INSERT INTO employee (age) VALUES (?) 
[params=(int) 25]} [code=-10, state=23000] 

为什么ID是不自动生成?

+0

你或许应该检查你的代码: @Column私人整数年龄; 公共雇员(整数年龄){ this.age =年龄; } – Pau 2010-11-17 13:06:49

+0

您是否有员工方的部门属性?这似乎在代码中缺失。借助该映射,侧面是拥有实体。尝试删除mappedby,而不是做坚持。 – lalit 2010-11-17 13:31:48

回答

1

您一对多的关系被映射为双向(由于mappedBy),但我看不到另一面。也许这是原因。

即使多到一边确实存在,它不是在你的代码初始化,虽然它是关系的拥有方,因此指定要反映到数据库中的状态。

如果你实际上意味着单向的关系,你需要删除mappedBy

相关问题