Spring 中使用Hibernate

主键自增策略有问题

从一个异常说起
dao 层设置如下

@Table(name = "wxorder_product_category")
@Entity
@Data
public class ProductCategory{

    @Id
    @GeneratedValue
    private Integer categoryId;
    private String categoryName;
    private Integer categoryType;
}

然后测试添加一条数据时,抛出异常。
测试代码

@RunWith(SpringRunner.class)
@SpringBootTest
public class ProductCategoryRepositoryTest{
  
      @AutoWired
      private ProductCategoryRepository repository;
      @Test
      public void saveTest(){
            ProductCategory productCategory = new ProductCategory();
            productCategory.setCategoryName("夏日甜品");
            productCategory.setCategoryType(4);
            repository.save(productCategory);
      }
}

抛出的异常

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'portal.hibernate_sequence' doesn't exist

原因及解决方案

名称 作用
TABLE 使用一个特定的数据库表格来保存主键
SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持
IDENTITY 主键由数据库自动生成(主要是自动增长型)
AUTO 主键由程序控制

JPA 使用提供四种主键解决方案。

名称 作用
TABLE 使用一个特定的数据库表格来保存主键
SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持
IDENTITY 主键由数据库自动生成(主要是自动增长型)
AUTO 主键由程序控制

在指定主键时,如果不指定主键的生成策略,默认为AUTO。
@Id
相当于

@Id
@GenerateValue(strategy = GenerationType.AUTO) 

也就是说,当表由Hibernate 创建时使用 AUTO合适。
当表已存在并且设置主键auto_increment时,使用@GenerateValue(strategy = GenerationType.IDENTITY)

你可能感兴趣的:(Spring 中使用Hibernate)