代码之家  ›  专栏  ›  技术社区  ›  Roman

JPA(Hibernate)中注释字段和方法的区别是什么?

  •  1
  • Roman  · 技术社区  · 14 年前

    就在几个小时前,我遇到了一个难看的问题:我在mssqlserver中使用JPA(通过Hibernate,但没有任何特定于Hybernate的java代码)。我把所有注解放在实体的字段上(直到今天我还是喜欢这种风格)。

    当我查看数据库时,我发现所有表列(应该是foreing键并且应该包含一些整数(id))实际上都有 varbinary(255, null) 类型并包含某些内容的哈希(我不知道那是什么,但它看起来像一个典型的MD5哈希)。

    最让人沮丧的是应用程序工作正常。但偶尔(在更新时)我会遇到mssql异常,它指出我试图插入太长的值,并且数据不能被截断。

    最后(作为一个实验),我从实体字段中删除了所有注释,并将它们全部放在方法中。我重新创建了DB,所有的表都包含了完美的FK列。这些列存储整数(id,比如1,3,4…)。

    有人能解释一下那是什么吗?

    this SO thread 公认的答案是,首选的方法是在字段上添加注释。至少就我的具体情况而言,我可以说这不是真的。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Pradip Bhatt    12 年前

    JPA允许对持久类的数据进行两种类型的访问。字段访问,这意味着它将实例变量(字段)映射到数据库中的列;属性访问,这意味着它使用getter来确定将映射到db的属性名称。使用哪种访问类型取决于@Id注释的位置(在Id字段或getId()方法上)。

        2
  •  0
  •   dsh Euxitheos    11 年前

    根据经验,我做了以下几点。

    1. @Entity
      @Table(name="MY_TABLE", schema = "MY_SCHEMA", uniqueConstraints = @UniqueConstraint(columnNames = "CONSTRAINT1"))
      
    2. 对于定义的字段,我没有将注释放在字段声明上,而是放在这些字段的getter方法上

      @Column(name = "MY_COL", table="MY_TABLE", nullable = false, length = 35)
      public String getMyCol() {
          return this.myCol;
      }
      
      public void setMyCol(String myCol) {
          this.myCol = myCol;
      }