2013-03-24 35 views
2

我有下面的类映射一个MySQL表:注解Hibernate映射ID /长外键可空列

@Entity 
@Table(name = "category") 
public class Category { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name = "id") 
    private long id; 

    @Column(name = "parent_id") 
    private long parentId; 

,并与具有parent_id列的NULL值列打交道时,我得到以下错误:

INFO: HHH000327: Error performing load command : org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.blogspot.symfonyworld.wealthylaughingduck.model.Category.parentId

这仅仅是一个Java错误:NULL不能被分配给long类型(private long parentId)。我找不到任何提示如何解决这个问题,我只能想到用Long代替long。这是一个好主意,或者可能有一些内置的hibernate注释或任何机制来做这些特定的东西?

回答

6

您将类属性定义为基元(long),但是您的数据库表包含相应列的空值。提供者(Hibernate)不会将null映射到原语,因为映射是不明确的。

如果您的数据可能包含空值,您需要使用相同的包装类(本例中为Long)。

@Entity 
@Table(name = "category") 
public class Category { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name = "id") 
    private long id; 

    @Column(name = "parent_id") 
    private Long parentId; 
} 
+0

好吧,所以这就是我想到的。我只是想知道是否有任何额外的注释。 – ducin 2013-03-24 20:44:55

+1

@tkoomzaaskz - nope,不需要额外的注释。建议(但不要求)用'@ Basic'注释所有基本类型和包装类型属性。 – Perception 2013-03-24 20:53:52

1

如果parentId为空,你需要把它映射为一个行业,你就需要使用包装类。

但是,如果(因为我怀疑从提交的名称)你明确地将外键映射为字段,你可能错过了mapping associations的一些ORM的真正实力。