【问题标题】:The difference between annotating fields and methods in JPA (Hibernate)?JPA(Hibernate)中注释字段和方法的区别?
【发布时间】:2010-07-21 23:00:44
【问题描述】:

JPA 规范或官方文档中是否有关于某些 JPA 实现的声明,这些声明描述了我们注释实体方法和注释实体字段时的行为?

就在几个小时前,我遇到了一个丑陋的问题:我将 JPA(通过 Hibernate,但在 java 代码中没有任何特定于 Hybernate 的代码)与 MS SQL Server 一起使用。我将所有注释都放在实体的字段上(直到今天我更喜欢这种风格)。

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

最令人沮丧的是应用程序运行正常。但偶尔(更新时)我得到 MS SQL 异常,指出我试图插入太长的值并且无法截断数据。

最终(作为实验)我从实体字段中删除了所有注释并将它们全部放在方法上。我重新创建了数据库,所有表都包含完美的 FK 列。并且这些列存储整数(ID,如 1、3、4 ...)。

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

我找到了this SO thread,并且接受的答案说首选方法是将注释放在字段上。至少对于我的具体情况,我可以说这不是真的。

【问题讨论】:

  • 由于某种原因,SO线程的链接不正确。
  • @Vineet Reynolds:谢谢!现在是正确的。
  • @Pascal Thivent:如果您根据自己的经验给出答案,我将不胜感激。我并不是说有一种首选方式,我们应该始终使用它。对于两种使用注释的方式,我注意到我的应用程序的行为完全不同。我正试图找出那是什么:错误或记录在 JPA 规范/Hibernate 文档行为中。
  • 从模式生成的角度来看,字段与属性访问不会改变任何东西(规范中没有任何内容,如果您使用相关部分是 2.3 访问类型有兴趣)-至少不应该-而且我从未遇到过您提到的问题。如果您可以重现问题,请提交问题,这将是一个错误。关于这两种方法的优缺点,请检查重复项。

标签: java sql-server hibernate jpa jpa-2.0


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据经验,我会执行以下操作。

    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;
      }
      

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2012-06-25
      • 2013-02-06
      • 2016-07-16
      • 2011-12-07
      • 2010-12-24
      相关资源
      最近更新 更多