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错误

Spring,JPA,Hibernate,Atomikos - 奇怪的启动错误

无法将空值分配给原始类型错误(Spring/Hibernate)