2015-07-03 2 views
4

Я пытаюсь исправить ошибку, вызванную запросом Hibernate на моем БД, но я не могу найти, откуда идет запрос. После включения sql log on hibernate я обнаружил, где ошибка, но не знаю, как исправить.Как найти/изменить запрос на спящий режим

Hibernate запрос (затмить журнал) "обновление students_classes установить student_id = нуль, где student_id =?"

метания: ОШИБКА [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-LOCALHOST-127.0.0.1-8080-2) Колонка «student_id» не может быть пустым

В соответствии с вашими другими отображениями я могу сказать наверняка studentId является первичным ключом таблицы, поэтому, если вы не знаете, идентификатор новые лица должны иметь, необходимо отметить поле, чтобы сделать зимует карта это:

Марк studentId в id и добавьте автоматически сформированное значение:

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

Hibernate определяет пять типов стратегий генерации идентификаторов:

  • АВТО - либо идентичность столбца, последовательность или таблицы в зависимости от базового DB
  • Таблица - таблица держа идентификатор
  • ИДЕНТИФИКАЦИЯ - столбец идентификаторов
  • ПОСЛЕДОВАТЕЛЬНОСТЬ - последовательность
  • удостоверение личности - личность копируется из другого объекта
+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. Укажите имя последовательности в конфигурации спящего режима.

    @Id 
        @SequenceGenerator(name = "StudentSeq", sequenceName="STUDENT_SEQ", allocationSize=1) 
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "StudentSeq") 
        @Column(name = "Student_id", nullable = false) 
        private Long StudentId; 
    
Смежные вопросы