Pet*_*ter 85 grails grails-orm
在grails域对象中使用原始属性时出现以下错误:
Null value was assigned to a property of primitive type setter of MyDomain.myAttribute
org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of MyDomain.myAttribute
at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1077)
Run Code Online (Sandbox Code Playgroud)
Mat*_*ttC 40
无法将null值分配给基本类型,如int,long,boolean等.如果对应于对象中字段的数据库列可以为null,那么您的字段应该是一个包装类,如Integer,Long,布尔等
如果数据库中没有空值,则代码将运行正常,但一旦插入空值,代码将失败.
并且您始终可以从getter返回基本类型.例如:
private Integer num;
public void setNum(Integer i) {
this.num = i;
}
public int getNum() {
return this.num;
}
Run Code Online (Sandbox Code Playgroud)
但在大多数情况下,您将需要返回包装类.
因此,要么将数据库列设置为不允许空值,要么使用包装类.
Nha*_*inh 12
基本类型不能为空.所以解决方案是在tableName.java文件中用原始包装类替换原始类型.如:
@Column(nullable=true, name="client_os_id")
private Integer client_os_id;
public int getClient_os_id() {
return client_os_id;
}
public void setClient_os_id(int clientOsId) {
client_os_id = clientOsId;
}
Run Code Online (Sandbox Code Playgroud)
参考http://en.wikipedia.org/wiki/Primitive_wrapper_class以查找primivite类型的包装类.
我将借助一个示例来使您理解。假设您有一个带有两列以及ID(int)和NAME(String)的关系表(STUDENT)。现在,作为ORM,您将使实体类如下所示:-
package com.kashyap.default;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @author vaibhav.kashyap
*
*/
@Entity
@Table(name = "STUDENT")
public class Student implements Serializable {
/**
*
*/
private static final long serialVersionUID = -1354919370115428781L;
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "NAME")
private String name;
public Student(){
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
假设表已经有条目。现在,如果有人要求您添加另一列“ AGE”(整数)
ALTER TABLE STUDENT ADD AGE int NULL
您必须将默认值设置为NULL才能在预填充表中添加另一列。这使您可以在类中添加另一个字段。现在出现了一个问题,您将使用原始数据类型还是非原始包装器数据类型来声明字段。
@Column(name = "AGE")
private int age;
Run Code Online (Sandbox Code Playgroud)
要么
@Column(name = "AGE")
private INTEGER age;
Run Code Online (Sandbox Code Playgroud)
您必须将字段声明为非原始包装数据类型,因为容器会尝试将表与实体映射。因此,如果您不将字段声明为包装器,它将无法映射NULL值(默认值),并最终抛出“将Null值分配给原始类型setter的属性”异常。
使用Integer作为类型并相应地提供setter/getter.
private Integer num;
public Integer getNum()...
public void setNum(Integer num)...
Run Code Online (Sandbox Code Playgroud)
小智 5
@Column(name ="LEAD_ID")
private int leadId;
Run Code Online (Sandbox Code Playgroud)
改成
@Column(name ="LEAD_ID")
private Integer leadId;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
105586 次 |
最近记录: |