【问题标题】:Hibernate only sets length within @Column on field, not attributeHibernate 只在字段的@Column 中设置长度,而不是属性
【发布时间】:2014-10-03 00:40:32
【问题描述】:

我有一些课程正在探索 Hibernate。其中一个有一个名称字段,我尝试使用以下内容设置它的长度:

private String firstname;
@Column(length=25)
public String getFirstName() { return firstName; }
public void setFirstName(String first) { this.firstName = first; }

我对多个字段执行此操作,所有字段都采用相同的模式——我将@Column 放在属性 firstName 上,而不是放在字段 firstName 上。我已经读到这决定了框架如何访问您的字段信息 - 直接从字段或从字段的 getter/setter。

可以将长度放在@Column 中的那个位置的想法在文档中得到了一定程度的确认;在 Hibernate Reference Documentation 的第 5.1.4.1.4 节“声明列属性”中,它具有以下几行:

@Column(updatable = false, name = "flight_name", nullable = false, length=50)
public String getName() { ... }

所以他们将 @Column 的长度属性放在 getter 前面。

问题是它不起作用。我的小测试程序为 hbm2ddl.auto 添加了一个属性来“创建”,以便它删除所有内容并重新创建它;该配置还与生成的 SQL 相呼应。在getter 前面有@Column,而不是字段,生成的字段是VARCHAR(255),与没有@Column 相同。

当我将@Column 移动到字段的前面时,它被创建为指定长度为 25。

这是一个错误,还是我遗漏了一些(其他)关于带有注释的 Hibernate 字段的配置?不幸的是,我不想要文档中提到的其他属性,而且我认为您必须指定其中一个才能获得长度识别,这很奇怪。

【问题讨论】:

  • 你必须保持一致。所有注释必须在字段上,或者所有注释必须在 getter 上。如果你混合使用两者,其中一半必须被忽略(@Id 的位置定义了 Hibernate 查找注释的位置)。
  • 根据 Hibernate 参考(H 版本 3.6.10,参考第 5.1.4.1.2 节“访问类型”,继承层次结构中的所有注释必须一致,并且@Id 定义了默认的访问类型(不是注解的默认位置)。你所说的内容有参考吗?我还发现了一些其他类似的说法不一样;我愿意假设我应该把 HibRef 作为比其他人更好的来源,但这是一个假设......
  • 抱歉,您似乎是对的;一旦我将 AccessType 更改为显式 PROPERTY,配置失败,因为 Id 注释在字段上而不是属性上。一旦我将 Id 从字段移动到 getter,其他配置操作就会失败,因为它们位于错误的位置。如果你知道一个地方确实有这个说法,我还是想看看。

标签: java hibernate annotations


【解决方案1】:

如果您想使用混合访问模式(即,在某些属性的字段上使用注释,而在其他属性的 getter 上使用注释),您必须采取一些额外的步骤。

首先,设置实体的默认访问类型。例如,这会将默认访问类型设置为 FIELD:

@Entity
@Access(AccessType.FIELD)
public class MyEntity { … }

然后对于要在 getter 上注释的属性,将访问类型显式设置为 PROPERTY:

@Access(AccessType.PROPERTY)
@Column(length=25)
public String getFirstName() { return firstName; }

【讨论】:

  • 好吧,我猜无论我读到什么都表明注释的位置确定类型是错误的,可能对 @Id 注释的位置以及它确定默认访问类型的事实感到困惑.我去看看,谢谢。
  • 注释的位置仅在它们都是相同类型时才确定类型:全部在字段上或全部在 getter 上。如果你想混合两者,你必须使用上面的技巧。
猜你喜欢
  • 1970-01-01
  • 2012-01-28
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多