可能的错误:Hibernate 4.3.5@Lob注释不';在野外使用时,不能在博士后工作

可能的错误:Hibernate 4.3.5@Lob注释不';在野外使用时,不能在博士后工作,hibernate,postgresql,jakarta-ee,jpa,postgresql-9.2,Hibernate,Postgresql,Jakarta 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
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
for
javax.persistence.Lob
@Target(value={FIELD,METHOD})
,所以我认为这可能是一个bug

这是一个bug,还是您知道一个说明差异的文档


相关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>

org.hibernate
冬眠核心
4.3.5.最终版本
org.hibernate
休眠实体管理器
4.3.5.最终版本
org.postgresql
postgresql
9.2-1004-jdbc41

在第一种情况下,最有可能的注释放错了位置。这就是为什么它会回到违约状态。在不通知持久性提供程序的情况下,不支持在getter和字段中混合持久性注释。从不查阅setter中的注释。若真的需要,那个么这就是正确的工具

例如:

@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规范,注释的不一致位置根本就不清楚,因此无法保证注释的行为:

实体层次结构中访问类型为的所有此类类 以这种方式设置的默认值必须在其位置上保持一致 字段或属性上的注释,以便, 在层次结构中应用一致的默认访问类型


我想你误解了这里的情况。在我给出的第一个代码示例中,注释与您声称的“正确”位置完全相同,就在字段上方。所以它不是放错地方了。我遗漏了什么吗?是的,你遗漏了我关于你问题中没有显示的代码的假设。关键是字段或属性都应该被注释——不支持在两者中混合注释。我的假设是,在您的代码中,其他持久性属性具有用于getter方法的持久性注释。如果是这样的话,这就解释了为什么字段的@Lob注释被忽略了,但getter也是如此。JPA的引述表明了这一点。非常感谢你!