2015-07-03 79 views
4

我试图修复由我的数据库上的Hibernate查询导致的错误,但我似乎无法找到查询来自哪里。启用sql登录休眠后,我发现错误在哪里,但不知道如何解决。如何查找/更改休眠查询

Hibernate query(eclipse log) “update students_classes set student_id = null where student_id =?”

投掷: ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper](HTTP-本地主机 - 127.0.0.1-8080-2)柱 'student_id数据' 不能为空

的错误是在这行抛出:

student = studentDAO.save(student); 

其中保存来自

public Entity save(Entity entity) throws Exception { 
     Entity result = null; 
     try { 
      trimAllStrAttributes(entity); 
      result = em.merge(entity); 
     } catch (Exception e) { 
      logger.error("Exception in AbstractDAO", e); 
      throw e; 
     } 

     return result; 
    } 


private void trimAllStrAttributes(Entity product) throws IntrospectionException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { 
     final Class c = product.getClass(); 
     for (PropertyDescriptor propertyDescriptor : Introspector.getBeanInfo(c, Object.class).getPropertyDescriptors()) { 
      Method method = propertyDescriptor.getReadMethod(); 
      if (method != null) { 
       String name = method.getName(); 

       // If the current level of Property is of type String 
       if (method.getReturnType().equals(String.class)) { 
        String property = (String) method.invoke(product); 
        if (property != null) { 
         try { 
          Method setter = c.getMethod("set" + name.substring(3), new Class<?>[] { String.class }); 
          if (setter != null) { 
           setter.invoke(product, property.trim()); 
          } 
         } catch (NoSuchMethodException nsme) { 
         } 
        } 
       } 
      } 
     } 
    } 

它可以是一个映射问题,所以这里是我的恩tities:

StudentClasses

@Column(name = "student_id") 
private Long studentId; 

@Column(name = "classes_id") 
private Long classesId; 

学生

@AuditJoinTable 
    @ManyToMany 
    @JoinTable(name = "students_classes", 
    joinColumns = @JoinColumn(name = "student_id", referencedColumnName = "id"), 
    inverseJoinColumns = @JoinColumn(name = "classes_id", referencedColumnName = "id")) 
    private List<Classes> classes; 

@NotAudited 
@OneToMany 
@JoinColumn(name = "student_id") 
private List<StudentClasses> studentsClasses; 

我应该怎么办?改变hibernate的查询(在哪里找到它?)还是在映射级别有问题?

+0

您应该包括在问题的堆栈跟踪 – meskobalazs

+0

你在做一个'setStudentClasses(newClasses)'在你的代码,更换托管集合?什么是'trimAllStrAttbributes'在做什么? –

+0

stacktrace的相关部分已经在这里@meskobalazs。我编辑了新的方法M. Deinum –

回答

2

错误解释本身:

投掷:ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper](HTTP-本地主机 - 127.0.0。1-8080-2)列“student_id数据”不能为空

按照您的其他映射,我可以肯定地说studentId是表的主键,所以,如果你不知道ID新的实体必须有,必须标记领域,使休眠图吧:

马克studentId为id并添加一个自动生成的值:

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Long studentId; 

Hibernate定义了五种类型的标识符生成策略:

  • AUTO - 取决于底层DB在任标识列,序列或表
  • - 表保存的ID
  • IDENTITY - 标识列
  • SEQUENCE - 序列
  • 身份复制 - 身份从另一个实体复制
+0

它没有工作,同样的错误出现@Jordi –

0

我的第一个猜测是,在这条线

result = em.merge(entity); 

entity对象没有一套studentId属性,一个是导致异常。所以你需要自己设置它,或者自动生成它,如其他答案所示。

1

问题在于StudentId主键的序列创建配置。你必须在这里做两件事。

  1. 在像下面的数据库创建序列..

    CREATE SEQUENCE STUDENT_SEQ 
        MINVALUE 1 
        MAXVALUE 999999999999999999999999999 
        START WITH 1 
        INCREMENT BY 1 
        CACHE 20; 
    
  2. 在Hibernate配置中指定的序列名称。

    @Id 
        @SequenceGenerator(name = "StudentSeq", sequenceName="STUDENT_SEQ", allocationSize=1) 
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "StudentSeq") 
        @Column(name = "Student_id", nullable = false) 
        private Long StudentId;