可能的错误:在字段上使用时,Hibernate 4.3.5 @Lob注释在Postgres中不起作用

时间:2014-06-12 10:15:33

标签: hibernate postgresql java-ee jpa postgresql-9.2

如果我使用

,则在实体中
@Lob
private String data;

public String getData() {
    return data;
}

public void setData(String data) {
    this.data = data;
}

然后该字段在数据库中创建为varchar(255)

但是,如果我这样使用:

private String data;

@Lob
public String getData() {
    return data;
}

@Lob
public void setData(String data) {
    this.data = data;
}

然后该字段在数据库中创建为text

我认为在这两种情况下,数据库中都应该是text

@Target的{​​p> javax.persistence.Lob@Target(value={FIELD, METHOD}),所以我认为这可能是一个错误。

这是一个错误,还是你知道一个说明差异的文件?


相关的pom.xml文件

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>4.3.5.Final</version>
</dependency>

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>4.3.5.Final</version>
</dependency>

<dependency>
  <groupId>org.postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <version>9.2-1004-jdbc41</version>
</dependency>

1 个答案:

答案 0 :(得分:2)

在第一种情况下,很可能注释是错误的。这就是它回归默认的原因。如果没有建议持久性提供程序,则不支持在getter和字段中混合持久性注释。从不咨询制定者的注释。如果真的需要,那么AccessType是正确的工具。

示例:

@Entity
public class Box  {
    @Id
    int id;
    @Lob //here is right place because also 'id' does have annotation in field
    String code;

    @Lob //this annotation is ignored because 'id' does have annotation in field 
    //if getId() (instead of field) is one with annotation, 
    //then this is right place
    public String getCode() {
        return code;
    }

    @Lob // persistence annotation here is not at all supported
    public void setCode(String code) {
        this.code = code;
    }

}

Hibernate使用@Id注释的位置来确定访问类型字段或属性。根据JPA 2.0规范,注释的不一致放置根本不是大声的,所以不能保证它应该如何表现:

  

访问类型为的实体层次结构中的所有此类   以这种方式违约必须保持一致   对字段或属性的注释,例如单个,   一致的默认访问类型适用于层次结构。