HQL持久化无法更新记录

时间:2017-08-28 19:53:29

标签: java mysql hibernate

我正在尝试实施classes表,以便classname文本字段对于每个termid必须是唯一的。文本字段不区分大小写(utf8_general_ci)。

MySQL的SQL脚本部分:

CREATE TABLE classes (
    ID INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
    classname VARCHAR(20) NOT NULL,
    classcode VARCHAR(20),
    termid INT(11) NOT NULL DEFAULT 0,  
    CONSTRAINT fk_classes_term
        FOREIGN KEY (termid) REFERENCES terms (id)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT,
    CONSTRAINT uc_classnames UNIQUE (termid, classname)
);

存储库层负责更新。我已经尝试过,无需异常处理。

public void updateClass(ClassEntity classEntity)
{
    entityManager.persist(classEntity);
    entityManager.flush();
}

我希望一旦发现冲突就抛出异常,即classname发生变化,使其与具有相同termid的现有实体使用的异常相同。 / p>

当我更改classname中的字母大小写时,我一直收到这样的错误。

  

CreateEditClassForm.onSubmit失败,但有异常。   org.springframework.transaction.TransactionSystemException:无法   提交JPA事务;嵌套异常是   javax.persistence.RollbackException:标记为的事务   rollbackOnly

我希望得到类似javax.persistence.EntityExistsException的内容。

SQL脚本是否有问题,或者是否可以使用数据库配置?

用户界面使用Java Wicket编码,更新时不必检查数据库。

编辑:使用一种(23种)方法添加ClassService。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

// project imports omitted

@Service
@Transactional
public class ClassService
{
    @Autowired
    private ClassRepository classRepository;

    @Autowired
    private ClassUsersRepository classUsersRepository;

    @Autowired
    private TermRepository termRepository;

    @Autowired
    private TermService termService;

    public void updateClass(ClassEntity classEntity)
    {
        classRepository.updateClass(classEntity);
    }
}

0 个答案:

没有答案