Простая проблема с отображением спящего режима - PullRequest
1 голос
/ 16 марта 2019

Я пытаюсь сделать простое сопоставление, но у меня проблемы.

По сути, у меня в Mysql есть таблица User с одним столбцом, который называется varchar(255) с именем пользователя и является первичным ключом.

У меня есть еще одна таблица, называемая заметками, которая имеет первичный автоматически генерируемый ключ, который представляет собой int, столбец date, varchar имя и столбцы содержимого и varchar(255), называемый владельцем, который долженсодержать имя пользователя

Это помечено как внешний ключ, ссылающийся на Users (имя пользователя).

Код для получения фабрики сеанса следующий:

 private static SessionFactory createSessionFactory() {
    SessionFactory sessionFactory;
    Configuration configuration = new Configuration();
    configuration.configure("hibernate.cfg.xml");
    configuration.addAnnotatedClass(Note.class);
    configuration.addAnnotatedClass(User.class);
    StandardServiceRegistry serviceRegistry = new 
StandardServiceRegistryBuilder().applySettings(
            configuration.getProperties()).build();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    return sessionFactory;
}

Это прекрасно работает без строкиэто добавляет аннотированный класс «Примечание», так что это, вероятно, проблема с этим классом.Ошибка следующая:

Не удалось получить конструктор для org.hibernate.persister.entity.SingleTableEntityPersister org.hibernate.MappingException

Полный трассировка стека :

Полные уроки доступны здесь:

Примечание

Пользователь

Тест

ОБНОВЛЕНИЕ: исправлено неправильное присвоение имени переменной Owner / OwnerName, однако теперь я получаю эту ошибку: ОШИБКА:

Невозможно добавить или обновить дочернюю строку: сбой ограничения внешнего ключа (notes. notes,ОГРАНИЧЕНИЕ notes_ibfk_1 ИНОСТРАННЫЙ КЛЮЧ (Owner) ССЫЛКИ users (username))

Stacktrace .

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Вы должны сначала сохранить пользователя, а затем сохранить заметку в своем тестовом классе. ваш код должен быть таким.

    @Test
    public void testSave() {

       Session session = factory.openSession();
       Date date = Date.valueOf(LocalDate.now());
       User user = new User("Joseph");
       Note note = new Note();
       note.setName("Joseph's note");
       note.setContents("blah blah blah");
       note.setOwnerName("Joseph");
       session.beginTransaction();
       session.save(user);
       session.save(note);
       session.getTransaction().commit();
       session.close();
       System.out.println(date);
   }

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "username")
 public String getOwner() {
    return owner;
}

наконец, ваш тестовый класс может быть таким:

    @Test
    public void testSave() {

       Session session = factory.openSession();
       Date date = Date.valueOf(LocalDate.now());
       User user = new User("Joseph");
       Note note = new Note();
       note.setName("Joseph's note");
       note.setContents("blah blah blah");
       note.setOwner(user);
       session.beginTransaction();
       session.save(user);
       session.save(note);
       session.getTransaction().commit();
       session.close();
       System.out.println(date);
   }
1 голос
/ 16 марта 2019

Проблема в классе Note.Для владельца переменной имя метода установки не является правильным.Вместо

public void setOwnerName(String u) { 
this.owner = u; 
}

Это должно быть

public void setOwner(String u) { 
this.owner = u; 
}

Это должно решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...