我有一些我正在探索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上的length属性放在getter前面。
问题在于它不起作用。我的小测试程序为hbm2ddl.auto添加了一个属性来“创建”,这样就可以删除所有内容并重新创建它;配置也回应了生成的SQL。如果@Column位于getter前面,而不是字段,则生成的字段为VARCHAR(255),与没有@Column相同。
当我将@Column移动到字段前面时,它会以指定的长度25创建。
这是一个错误,还是我遗漏了关于带注释的Hibernate字段配置的其他内容?不幸的是,我不想要文档中提到的其他属性,我觉得很奇怪你必须指定其中一个才能获得长度识别。
答案 0 :(得分:0)
如果您想使用混合访问模式(即在某些属性的字段上使用注释,而在其他人使用getter),则必须采取一些额外的步骤。
首先,设置实体的默认访问类型。例如,这会将默认访问类型设置为FIELD:
@Entity
@Access(AccessType.FIELD)
public class MyEntity { … }
然后,对于要在getter上进行注释的属性,将访问类型显式设置为PROPERTY:
@Access(AccessType.PROPERTY)
@Column(length=25)
public String getFirstName() { return firstName; }