Spring 和 Hibernate 错误——非空属性引用空值或瞬态值:com.tharaka.model.Employee.designation
Posted
技术标签:
【中文标题】Spring 和 Hibernate 错误——非空属性引用空值或瞬态值:com.tharaka.model.Employee.designation【英文标题】:Spring and Hibernate Error -- not-null property references a null or transient value: com.tharaka.model.Employee.designation 【发布时间】:2013-09-23 05:01:10 【问题描述】:我是 Spring 和 hibernate 的新手,尝试持久化事务数据时出现上述错误。请尝试解决这个问题 这是我的实体:
@Entity @NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e")
public class Employee implements Serializable
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String city;
private String civil;
@Temporal(TemporalType.DATE)
@Column(name="dob", length=11)
private Date dob;
private String email;
private int epf;
private String fname;
private String gender;
private int landtp;
private String lname;
@Temporal(TemporalType.DATE)
@Column(name="salaryincrement", length=11)
//bi-directional many-to-one association to Designation
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="designation_id", nullable=false)
private Designation designation;
public Employee()
@Entity
@NamedQuery(name="Designation.findAll", query="SELECT d FROM Designation d")
public class Designation implements Serializable
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String type;
//bi-directional many-to-one association to Employee
@OneToMany(mappedBy="designation")//, cascade=CascadeType.ALL
private List<Employee> employees;
public Designation()
这是我的实体类, 实体有一个 getter 和一个 setter
【问题讨论】:
【参考方案1】:designation
设置为 nullable = false
。但是employees
变量未在Designation
中初始化。所以,你必须初始化为
@OneToMany(mappedBy="designation")//, cascade=CascadeType.ALL
private List<Employee> employees = new LinkedList<>();
【讨论】:
尊敬的先生,我的代码中仍然有同样的错误,我的映射注释对吗? 尝试删除@JoinColumn(name="designation_id", nullable=false)
中的nullable=false
。毕竟,它也可以在应用程序级别而不是数据库级别进行处理。
是的,它可以工作,但另一个错误变成“严重:Servlet.service() for servlet [spring] in context with path [/CEB] throw exception [Request processing failed;嵌套异常是 org.hibernate .exception.ConstraintViolationException:无法插入:[com.tharaka.model.Employee]],根本原因是 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:列 'designation_id' 不能为空"
您可能会问另一个问题,并提供更多详细信息。此外,您的实体定义非常混乱,因为您将 @Temporal(TemporalType.DATE)
用于 designation
您确定您的 designation_id
列在数据库架构中是 AUTO_INCREMENT
吗?【参考方案2】:
我不确定您是否可以使用原始类型 int
作为您的 ID - 您可能应该使用 Integer
- 因为 int
具有默认零值并且不能为 null,您的新记录可以被视为 ID 为零的独立实体,而不是临时实体。
同样的错误出现在Designation
类中。
见Primitive or wrapper for hibernate primary keys
【讨论】:
尊敬的先生,我已经尝试过,但我的代码中仍然有同样的错误,请给我另一种方法.. 更改 id 部分,请发布保存实体的实际代码。 Employee 和 Designation 之间的关系不是级联的 - 您是否引用了来自Employee
的未保存的 Designation
?
如果关系是级联的,你可能应该使用cascade=CascadeType.PERSIST, ...
,否则你不应该。 mkyong.com/hibernate/…
从设计的角度来看,Designation
不应该级联,因为几个员工可以有相同的 designation,所以你应该在会话上单独调用 save/persist 来保存它,使用 Employee 实体创建 Designation 似乎不太好。
选择查询有效,它会在视图中生成员工详细信息,但插入无效以上是关于Spring 和 Hibernate 错误——非空属性引用空值或瞬态值:com.tharaka.model.Employee.designation的主要内容,如果未能解决你的问题,请参考以下文章
Spring JPA 和 Hibernate 的 JPQL 查询错误
Spring boot、mvc、hibernate 和 mysql 配置 - sessionFactory 错误
long 类型的错误值:- Postgresql、Hibernate、Spring
Spring 4和Hibernate 4 Session错误