【问题标题】:How to set default boolean value in JPA如何在 JPA 中设置默认布尔值
【发布时间】:2015-03-28 05:52:19
【问题描述】:

我有一个属性

private boolean include;

我想将其默认值设置为 true,以便在数据库中它必须从默认值显示 True。这在 JPA 中可行吗?

【问题讨论】:

  • 您可以使用assigning来更改默认值。创建setter方法并设置true值。
  • private boolean include = true; 将适用于 Java。不过,您必须确保您的数据库直接支持 boolean 字段,或者您必须使用转换器。
  • 您可以尝试以下操作吗? Column(name="Include ") private boolean include = true;
  • 您好,我的数据库是 sql server,使用数据类型位,所以它应该支持布尔值。我已经在 cmets 中尝试了上述方法,但默认情况下数据库中仍然没有显示值
  • 我发现在 JPA 中处理 boolean 值时,使用 Boolean 总是比使用 boolean 更好。在某些版本的 Spring Boot 中,更新实体时会抛出后面的异常

标签: java jpa


【解决方案1】:

您始终可以在方法上使用注释 @PreUpdate@PrePersist,您将设置在更新之前或保存到数据库之前应该做什么。

或者只是简单地设置值private boolean include = true;

【讨论】:

    【解决方案2】:

    据我所知,没有提供默认值的 JPA 原生解决方案。 这是我的解决方法:

    非数据库可移植解决方案

    @Column(columnDefinition="tinyint(1) default 1")
    private boolean include;
    

    面向 Java 的解决方案

    private boolean include = true;
    

    面向 Java 的加 Builder 模式

         @Column(nullable = false)
         private Boolean include;
         ...
         public static class Builder {
          private Boolean include = true; // Here it comes your default value
          public Builder include (Boolean include ) {
          this.include = include ;
          return this;
         }
         // Use the pattern builder whenever you need to persist a new entity.
         public MyEntity build() {
           MyEntity myEntity = new MyEntity ();
           myEntity .setinclude (include );
           return myEntity;
          }
    ...
    }
    

    这是我最喜欢的,不那么打扰。基本上,它将任务委派给实体中的 Builder 模式定义默认值。

    【讨论】:

    • @Column(columnDefinition="BOOLEAN DEFAULT false") 也适用于包括 PostgreSQL 在内的许多数据库。
    • 知道 JPA 委员会建议开发人员做什么吗?
    【解决方案3】:

    使用 JPA 2.1 和 Oracle 11,这适用于我,使用大小为 1 的 Oracle 类型 NUMBER:

    Java:

    @Column(name = "ENABLED", nullable = false)
    private boolean enabled = true;
    

    创建 SQL 脚本:

    CREATE TABLE "ACCOUNT"(
    "ID" NUMBER(10,0) NOT NULL ENABLE,
    "NAME" VARCHAR2(255 CHAR) NOT NULL ENABLE,
    "PASSWORD" VARCHAR2(255) NOT NULL ENABLE,
    "ENABLED" NUMBER(1,0) DEFAULT 1 NOT NULL ENABLE,
    PRIMARY KEY ("ID")
    );
    

    【讨论】:

      【解决方案4】:

      我发现在构造函数中添加是一个很好的解决方法,可以将新实体默认为一个值:

      public EntityName(){
          this.fieldToDefault = default;
      }
      

      【讨论】:

        【解决方案5】:
        private boolean include = true;
        

        【讨论】:

        • 您好 尝试添加一些解释来为您的代码评估者提供上下文,而不仅仅是粘贴代码。虽然这对您来说可能很有意义,但最好解释一下。
        • 在读取过程中,您的值将被数据库值覆盖,因此这不是解决方案。
        【解决方案6】:

        也许对使用 Microsoft SQL SERVER 的人有用

            @Column(columnDefinition="bit default 0")
            private Boolean active;
        

        可能的值:0 或 1

        【讨论】:

          【解决方案7】:

          对于 PostgreSQL,您可以在定义中使用布尔值

          @Column(name = "isDeleted", columnDefinition = "boolean default true")
          private boolean isDeleted = true;
          

          【讨论】:

          • 如果我们在列定义中使用默认值,那你为什么要再次初始化为true?
          • 用于休眠。它直接考虑分配的值并将其插入表中
          【解决方案8】:

          如果您在数据库中定义了默认值,您可以选择列注解,并使用insertable = false作为参数,这样在插入值时,它将选择您在数据库中默认标记的那个。例子: 在 MySQL 中,我有一个带有布尔类型状态属性的 person 表,默认情况下它的值为 true。 在您的 java 类中,它看起来像这样:

          //....
          public class Person implements Serializable {
              //.....
              @Column(insertable = false)
              private Boolean status;
              //...
          }
          

          您可以了解更多关于列注释HERE的信息,它解释得很好,对我帮助很大。

          【讨论】:

            【解决方案9】:

            设置默认列值的简单方法是直接将其设置为实体属性值:

            @Entity
            public class Student {
                @Id
                private Long id;
                private String name = "Ousama";
                private Integer age = 30;
                private Boolean happy = false;
            }
            

            【讨论】:

            • 这种方法的问题是在使用像 Example.of 方法这样的存储库时。使用上述解决方案,如果我只需要搜索 name = "Adam" 那么搜索还将包括年龄和快乐,默认情况下进行搜索,开发人员必须始终删除此类默认值
            【解决方案10】:

            在我的例子中,对于 Spring Boot jpa,在实体类中使用以下语法。

            @Builder.Default
            private boolean columnName = false;
            
            or
            
            @NotNull
            @Builder.Default
            @ColumnDefault("true")
            private Boolean columnName = true;
            

            @Builder.Default 是为了确保我们在为此模型构造对象时具有默认值,仅当实体模型类使用@Builder 注释时才需要。如果不是这样,即使没有@Builder.Default,事情也能按预期正常工作。

            【讨论】:

            • @NotNull @ColumnDefault("true") 就足够了。 @Builder.Default 抛出异常。
            • 我的错误应该进一步解释一下,如果我们有实体的@Builder 注释,则可以使用@Builder.Default。 Lombok 插件支持@Builder 生成bean
            猜你喜欢
            • 2013-03-06
            • 2019-11-09
            • 1970-01-01
            • 2020-05-21
            • 2015-01-11
            • 1970-01-01
            • 2021-12-03
            • 2017-04-17
            • 2022-01-25
            相关资源
            最近更新 更多