【问题标题】:Spring and Hibernate Error -- not-null property references a null or transient value: com.tharaka.model.Employee.designationSpring 和 Hibernate 错误——非空属性引用空值或瞬态值: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

【问题讨论】:

    标签: spring hibernate spring-mvc spring-security


    【解决方案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 似乎不太好。
    • 选择查询有效,它会在视图中生成员工详细信息,但插入无效
    猜你喜欢
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多