Исключение JPA RollbackException, но не в модульном тестировании

#java #jpa #smartfoxserver

#java #mysql #jpa

Вопрос:

У меня есть проект Java с набором модульных тестов, которые выполняют простые обновления, удаляют с помощью JPA2. Модульные тесты выполняются без проблем, и я могу проверить изменения в базе данных — все хорошо. Я пытаюсь скопировать / вставить эту же функцию в обработчик (расширение Smartfox) — я получаю исключение отката.

Столбец ‘levelid’ не может быть нулевым.

Ищу предложения относительно того, почему это может быть. Я могу выполнять чтение данных из этого расширения ( GetModelHandler ), но попытка установить данные не работает. Это совершенно сбивает с толку.

Итак, вкратце —

Это работает…

 @Test
public void Save()
{
    LevelDAO dao = new LevelDAO();
    List levels = dao.findAll();
    int i = levels.size();      
    Level l = new Level();          
    l.setName("test");
    Layer y = new Layer();
    y.setLayername("layer2");
    EntityManagerHelper.beginTransaction();
    dao.save(l);
    EntityManagerHelper.commit();
}
  

Это завершается ошибкой с исключением отката

 public class SetModelHandler extends BaseClientRequestHandler
{
@Override
public void handleClientRequest(User sender, ISFSObject params)
{
    LevelDAO dao = new LevelDAO();
    List levels = dao.findAll();
    int i = levels.size();      
    Level l = new Level();          
    l.setName("test");
    Layer y = new Layer();
    y.setLayername("layer2");
    EntityManagerHelper.beginTransaction();
    dao.save(l);
    EntityManagerHelper.commit();
}

}
  

Класс Level и Layer имеют атрибут OneToMany и ManyToOne соответственно.

Какие-либо идеи появились.

Обновить

Вот схема

 Level
--------
 levelid    (int)  PK
 name       (varchar)  


Layer
--------
layerid     (int) 11  PK
layername   (varchar) 100
levelid   (int) 
            Foreign Key Name:Level.levelid ,  
            On Delete:   no action, 
            On Update:   no action
  

Когда я изменил

 EntityManagerHelper.beginTransaction();
dao.update(l);
EntityManagerHelper.commit();
  

Для

 EntityManagerFactory factory = Persistence.createEntityManagerFactory("bwmodel");
EntityManager entityManager = factory.createEntityManager();
    entityManager.getTransaction().begin();
dao.update(l);
    entityManager.persist(l);
    entityManager.getTransaction().commit();
  

Это выполняет сохранение, но не обновление? Здесь я упускаю что-то очевидное.

Комментарии:

1. Не могли бы вы опубликовать свою схему БД, чтобы мы могли ее просмотреть?

Ответ №1:

Наиболее вероятной проблемой, которую я вижу, будут разные определения базы данных. При тестировании EJB часто используется база данных в памяти, которая генерируется «на лету». В то время как в реальном производстве вы используете реальную базу данных, которая, вероятно, применяет ограничения.

Попробуйте присвоить значению levelid значение или изменить схему базы данных.