【问题标题】:@UniqueConstraint annotation in JavaJava中的@UniqueConstraint注解
【发布时间】:2011-03-08 19:02:10
【问题描述】:

我有一个 Java bean。现在,我想确保该字段应该是唯一的。

我正在使用以下代码:

@UniqueConstraint(columnNames={"username"})
public String username;

但我遇到了一些错误:

@UniqueConstraint is dissallowed for this location

使用唯一约束的正确方法是什么?

注意:我正在使用游戏框架。

【问题讨论】:

  • “但我遇到了一些错误。” 总是 指定您在问题中遇到的错误。您有相关信息可以很好地帮助我们解决您的问题 - 不要自己保密。
  • 可以使用@id注解吗?
  • 精彩的评论 Jon Skeet,让我开心!

标签: java jpa unique-constraint


【解决方案1】:

为了确保字段值是唯一的,您可以编写

@Column(unique=true)
String username;

@UniqueConstraint 注释用于在表级别注释多个唯一键,这就是将其应用于字段时出错的原因。

参考资料(JPA TopLink):

【讨论】:

  • 重要的是要注意它只有在让 JPA 创建表时才有效
【解决方案2】:

您可以使用以下语法在类级别使用

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"username"})})
public class SomeEntity {
    @Column(name = "username")
    public String username;
}

【讨论】:

    【解决方案3】:

    我目前也在使用带有 hibernate 和 JPA 2.0 注释的播放框架,这个模型可以正常工作

    @Entity
    @Table(uniqueConstraints={@UniqueConstraint(columnNames = {"id_1" , "id_2"})})
    public class class_name {
    
    @Id
    @GeneratedValue
    public Long id;
    
    @NotNull
    public Long id_1;
    
    @NotNull
    public Long id_2;
    
    }
    

    希望对您有所帮助。

    【讨论】:

    • 我希望你在现实生活中不要使用这些字段进行编码;)
    • 当然不是,但我确实会用这些字段编写示例:D
    【解决方案4】:

    注意:在 Kotlin 中,在注解中声明数组的语法使用 arrayOf(...) 而不是 {...}

    @Entity
    @Table(uniqueConstraints=arrayOf(UniqueConstraint(columnNames=arrayOf("book", "chapter_number"))))
    class Chapter(@ManyToOne var book:Book,
                  @Column var chapterNumber:Int)
    

    注意:从 Kotlin 1.2 开始,可以使用 [...] 语法,因此代码变得更加简单

    @Entity
    @Table(uniqueConstraints=[UniqueConstraint(columnNames=["book", "chapter_number"])])
    class Chapter(@ManyToOne var book:Book,
                  @Column var chapterNumber:Int)
    

    【讨论】:

    • 感谢@Larrikin - 这确实改善了答案!
    【解决方案5】:

    方式1:

    @Entity
    @Table(name = "table_name", 
           uniqueConstraints={
                              @UniqueConstraint(columnNames = "column1"),
                              @UniqueConstraint(columnNames = "column2")
                             }
          )
    

    -> 这里 Column1 和 Column2 分别作为唯一约束。 例如:如果任何时候 column1 或 column2 的值匹配,那么您将收到 UNIQUE_CONSTRAINT 错误。

    方式2:

    @Entity
    @Table(name = "table_name", 
           uniqueConstraints={@UniqueConstraint(columnNames ={"column1","column2"})})
    

    -> 这里 column1 和 column2 的组合值都充当唯一约束

    【讨论】:

      【解决方案6】:
         @Entity @Table(name = "stock", catalog = "mkyongdb",
         uniqueConstraints = @UniqueConstraint(columnNames =
         "STOCK_NAME"),@UniqueConstraint(columnNames = "STOCK_CODE") }) public
         class Stock implements java.io.Serializable {
      
         }
      

      唯一约束仅用于创建复合键,它将是唯一的。它将表作为主键组合为唯一。

      【讨论】:

        【解决方案7】:

        @UniqueConstraint 此注解用于在表级别对单个或多个唯一键进行注解,以逗号分隔,这就是您收到错误的原因。 只有让 JPA 创建表时它才会起作用

        例子

        @NoArgsConstructor
        @AllArgsConstructor
        @Getter
        @Setter
        @Builder(builderClassName = "Builder", toBuilder = true)
        @Entity
        @Table(name = "users", uniqueConstraints = @UniqueConstraint(columnNames = {"person_id", "company_id"}))
        public class AppUser extends BaseEntity {
        
            @Column(name = "person_id")
            private Long personId;
        
            @ManyToOne
            @JoinColumn(name = "company_id")
            private Company company;
        }
        

        https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/UniqueConstraint.html

        另一方面,为了确保字段值是唯一的,您可以编写

        @Column(unique=true)
        String username;
        

        【讨论】:

          【解决方案8】:

          定义列约束

          只要唯一约束仅基于一个字段,我们就可以在该列上使用@Column(unique=true)。

          让我们在 personNumber 字段上定义一个唯一约束:

          @Column(unique=true)
          private Long personNumber;
          

          当我们执行架构创建过程时,我们可以从日志中对其进行验证:

          [main] DEBUG org.hibernate.SQL -
              alter table Person add constraint UK_d44q5lfa9xx370jv2k7tsgsqt unique (personNumber)
          

          定义唯一约束

          JPA 使用 @UniqueConstraint 注释帮助我们实现这一目标。我们在 uniqueConstraints 属性下的 @Table 注释中执行此操作。让我们记住指定列的名称:

          @Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "personNumber", "isActive" }) })
          

          我们可以在模式生成后对其进行验证:

          [main] DEBUG org.hibernate.SQL -
              alter table Person add constraint UK5e0bv5arhh7jjhsls27bmqp4a unique (personNumber, isActive)
          

          【讨论】:

            【解决方案9】:

            您可以在类级别上使用@UniqueConstraint,用于表中的组合主键。例如:

             @Entity
             @Table(name = "PRODUCT_ATTRIBUTE", uniqueConstraints = {
                   @UniqueConstraint(columnNames = {"PRODUCT_ID"}) })
            

            公共类 ProductAttribute{}

            【讨论】:

              【解决方案10】:

              唯一的注解应该放在属性声明的正上方。 UniqueContraints 进入数据类声明上方的@Table 注释。见下文:

              @Entity
              @Table(uniqueConstraints= arrayOf(UniqueConstraint(columnNames = arrayOf("col_1", "col_2"))))
              data class Action(
                      @Id @GeneratedValue @Column(unique = true)
                      val id: Long?,
                      val col_1: Long?,
                      val col_2: Long?,
              )
              

              【讨论】:

                【解决方案11】:

                length属性的值必须大于等于name属性长度,否则会报错。

                作品

                @Column(name = "typ e", length = 4, unique = true)
                private String type;
                

                不起作用,type.length: 4 != length property: 3

                @Column(name = "type", length = 3, unique = true)
                private String type;
                

                【讨论】:

                  【解决方案12】:

                  对我来说,添加 @Column(name = "column_name", length = 11, unique = true) 有效

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2013-02-28
                    • 2011-08-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-02-13
                    • 2013-09-09
                    • 1970-01-01
                    相关资源
                    最近更新 更多