嵌套异常是 org.hibernate.exception.GenericJDBCException:无法执行语句

Vin*_*loo 3 java database spring hibernate jpa

我被迫在一个小项目中使用 Maven、Hibernate、Spring 和 JPA 存储库。我高兴地认为这里找到的信息

http://docs.spring.io/spring-data/jpa/docs/1.4.2.RELEASE/reference/html/jpa.repositories.html

至少足以创建一个简单的应用程序。不幸的是,事实并非如此。我已经设法从 MySQL 数据库读取数据,但目前无法插入任何数据。

这是一个简单的“用户”模型类。

@Entity
@Table(name = "ctuser")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long uid;

    @Column(name = "Gmail", nullable = false)
    private String gmail;


    public String getGmail() {
        return gmail;
    }

    public void setGmail(String gmail) {
        this.gmail = gmail;
    }

    @Override
    public String toString() {
        return getGmail();
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个适当的存储库接口......

package put.io.come_together.service.persistance.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import put.io.come_together.model.User;

public interface UserRepository extends JpaRepository<User, Long> {

    User findUserByUid(long uid);

    User save (User obj);

    }
Run Code Online (Sandbox Code Playgroud)

...服务的接口...

public interface UserService {

    User getUser(long uid);

    User addUser(User obj);

    List<User> getAll();

}
Run Code Online (Sandbox Code Playgroud)

...以及接口的实现。

@Service
public class UserServiceImpl implements UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public User getUser(long uid) {return userRepository.findUserByUid(uid);
    }

    @Transactional
    @Override
    public User addUser(User obj) {return this.userRepository.saveAndFlush(obj);}

    @Override
    public List<User> getAll() {
        return userRepository.findAll();
    }
Run Code Online (Sandbox Code Playgroud)

最后,我尝试将数据呈现为数据并将某些内容插入数据库。

@Controller
public class HomePageController {


    @Autowired
    private UserService userService;

    private static final String USER_MAP_KEY = "groups";
    private static final String USER_LIST_TEMPLATE_NAME = "groupList";

    @RequestMapping("/")
    String hello(Map<String, Object> model) {
        User osoba = new User();
        osoba.setGmail("ADAMWEST");
        userService.addUser(osoba);

        List<User> userGroupsList = userService.getAll();
        model.put(USER_MAP_KEY, userGroupsList);
        return USER_LIST_TEMPLATE_NAME;
    }

}
Run Code Online (Sandbox Code Playgroud)

如果我省略该行userService.addUser(osoba);,一切都会正常。我可以看到从数据库读取的数据整齐地排列在一起。但是当我尝试实际使用该.addUser()方法时,我的本地主机会显示一个白色标签错误页面。

白标错误页面

此应用程序没有 /error 的显式映射,因此您将其视为后备。2015 年 4 月 19 日星期日 09:36:52 发生意外错误(类型 = 内部服务器错误,状态 = 500)。无法执行语句;嵌套异常是 org.hibernate.exception.GenericJDBCException:无法执行语句

你能告诉我我做错了什么吗?我已经尝试解决这个问题有一段时间了,但彻底失去了希望。

这是异常的堆栈跟踪。该错误涉及字段“UID”没有默认值,但我将其标记为@Id 字段。我还删除了整个数据库并重新设置它,因为它帮助了遇到类似问题的人。

@Entity
@Table(name = "ctuser")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long uid;

    @Column(name = "Gmail", nullable = false)
    private String gmail;


    public String getGmail() {
        return gmail;
    }

    public void setGmail(String gmail) {
        this.gmail = gmail;
    }

    @Override
    public String toString() {
        return getGmail();
    }
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 5

你说Hibernate的ID是使用AUTO策略自动生成的。MySQL 的这一策略包括让数据库使用自动增量列生成 ID。所以如果你没有定义uid为自动增量,那是行不通的。