【问题标题】:H2 Spring-Data - default value doesn't workH2 Spring-Data - 默认值不起作用
【发布时间】:2018-07-06 21:14:13
【问题描述】:

当我在 H2 数据库中持久化一个没有该属性值的对象时,我试图为一个属性设置一个默认值。

即使使用正确的实体声明,也不会保留默认值。

我想知道为什么以及如何解决它,我在下面的代码中隔离了问题:

  • application.properties

    spring.h2.console.enabled=true
    spring.h2.console.path=/h2
    spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false
    spring.datasource.username=sa
    spring.datasource.password=
    spring.jpa.generate-ddl=true
    spring.jpa.show-sql=false
    
  • 实体

    package com.h2.H2POC;
    
    import org.hibernate.annotations.ColumnDefault;
    
    import javax.persistence.*;
    @Entity
    @Table(name = "car")
    public class Car {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        @Column(name = "company")
        @ColumnDefault(value = "'Toyota'")
        private String company;
    
        @Override
        public String toString() {
            return "Car{" +
                   "id=" + id +
                   ", company='" + company + '\'' +
                   '}';
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getCompany() {
            return company;
        }
    
        public void setCompany(String company) {
            this.company = company;
        }
     }
    
  • 服务

     @Service
     public class CarService {
    
        @Autowired
        private CarRepository repository;
    
        @PostConstruct
        public void init(){
          Car car = new Car();
          repository.save(car);
        }
    
        public List<Car> getCar (){
          return repository.findAll();
        }
     }
    

当我查看日志时,我可以看到数据库是使用属性 company 的默认值创建的。

    14:26:03.087 [main] DEBUG org.hibernate.SQL - drop table car if exists
    14:26:03.087 [main] DEBUG org.hibernate.SQL - create table car (id bigint generated by default as identity, company varchar(255) default 'Toyota', primary key (id))

这个例子使用了这些依赖:

    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>

      <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
      </dependency>
   </dependencies>

主要依赖的版本是:

   spring-data-jpa:1.11.9.jar
   com.h2database:1.4.196.jar

提前感谢您的反馈。

【问题讨论】:

    标签: spring-data spring-data-jpa jpa-2.0 h2


    【解决方案1】:
    @Column(name = "company")
    @ColumnDefault(value = "'Toyota'")
    private String company;
    

    这是您所说的默认值吗?如果是,这不是您添加默认值的方式。你可以简单地做到这一点。

    private String company = "Toyota";
    

    如果这就是你想要做的。这可能有效。但有些人会这样做:

    @Column(name = “myColumn”, nullable = false, columnDefinition = “text default Toyota")
    

    至于columnDefinition = “text default Toyota" 部分,我不太确定你是不是这样写的。可能是columnDefinition = “String default Toyota"

    【讨论】:

    • 我测试了你的第二个命题:@Column(name = "company", nullable = false, columnDefinition = "text default 'Toyota'") 但这不起作用我有一个例外。对于第一个解决方案,我知道我可以做一些我想了解它为什么不起作用的事情,我需要花更多时间来调查 H2 出了什么问题。谢谢你的帮助。
    • 可以看到create table和上一个答案类似:22:03:43.508 [main] DEBUG org.hibernate.SQL - create table car (id bigint默认生成为identity, company文本默认'Toyota'不为空,主键(id))
    • 这个答案似乎没有考虑到我们只是使用迁移脚本中的插入或类似性质的东西的情况。根据我的经验,h2 不尊重默认值
    猜你喜欢
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    相关资源
    最近更新 更多