JPA规范或官方文档中是否有关于某些JPA实现的陈述,这些陈述描述了当我们注释实体的方法时以及当我们注释实体的字段时的行为?
就在几个小时前,我遇到了一个丑陋的问题:我使用JPA(通过Hibernate,但在Java代码中没有任何特定的Hybernate)与MS SQL Server。我把所有注释都放在实体的字段上(直到今天我更喜欢这种风格)。
当我查看数据库时,我发现所有表格列应该是外键,哪些应该包含一些整数(ids)实际上有varbinary(255, null)
类型并包含某些哈希值(我不知道是什么是的,但它看起来像一个典型的MD5哈希)。
最令人沮丧的是应用程序正常运行。但偶尔(在更新时)我得到MS SQL异常,表示我试图插入太长的值,数据不能被截断。
最终(作为实验)我从实体字段中删除了所有注释,并将所有注释放在方法上。我重新创建了DB,所有表都包含完美的FK列。这些列存储整数(id,如1,3,4 ......)。
那么,有人可以解释那是什么吗?
我找到this SO thread并且接受的回答是,首选的方法是在字段上添加注释。至少对于我的具体案例,我可以说这不是真的。
答案 0 :(得分:0)
根据经验,我会做以下几点。
我将实体详细信息放在实体类定义的顶部(例如,模式,行约束等)....
@Entity
@Table(name="MY_TABLE", schema = "MY_SCHEMA", uniqueConstraints = @UniqueConstraint(columnNames = "CONSTRAINT1"))
对于定义的字段,我不会将注释放在字段声明上,而是放在那些字段的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;
}
答案 1 :(得分:0)
JPA允许对持久化类的数据进行两种类型的访问。字段访问意味着它将实例变量(字段)映射到数据库中的列和Property访问,这意味着它使用getter来确定将映射到db的属性名称。它将使用的访问类型取决于您放置@Id注释的位置(在id字段或getId()方法上)。