#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 значение или изменить схему базы данных.