休眠:可插入 = false,可更新 = false 在涉及外键的复合主键星座中属于何处?
在 Hibernate 或其他 ORM 中实现复合主键时,最多有三个位置可以将可插入 = false,可更新 = false 放在使用识别关系的复合主键星座(作为 PK 一部分的 FK)中:
- 进入复合 PK 类的@Column注释(仅限@Embeddable类)或
- 进入实体类的关联@JoinColumn/s 注释或
- 进入实体类的冗余 PK 属性的@Column注释(仅限@IdClass类)
第三种是处理@IdClass和JPA 1.0 AFAIK的唯一方法。请参阅 http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_Relationships。我只考虑案例1。和 2.
问:通常哪种方式放置“可插入 = 假,可更新 = 假”?
我在Hibernate上遇到了关于这个问题的问题。例如,Hibernate 3.5.x会抱怨Zips表
CREATE TABLE Zips
(
country_code CHAR(2),
code VARCHAR(10),
PRIMARY KEY (country_code, code),
FOREIGN KEY (country_code) REFERENCES Countries (iso_code)
)
跟:
org.hibernate.MappingException: Repeated column in mapping for entity: com.kawoolutions.bbstats.model.Zip column: country_code (should be mapped with insert="false" update="false")
org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:676)
org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:698)
...
如您所见,country_code列同时是 PK 和 FK。以下是它的类:
实体类:
@Entity
@Table(name = "Zips")
public class Zip implements Serializable
{
@EmbeddedId
private ZipId id;
@ManyToOne
@JoinColumn(name = "country_code", referencedColumnName = "iso_code")
private Country country = null;
...
}
复合 PK 类:
@Embeddable
public class ZipId implements Serializable
{
@Column(name = "country_code", insertable = false, updatable = false)
private String countryCode;
@Column(name = "code")
private String code;
...
}
将可插入 = false,可更新 = false 放入实体类关联的@JoinColumn所有异常都将消失,一切正常。但是,我不明白为什么上面的代码不应该工作。可能是Hibernate有问题。所描述的Hibernate错误,因为它似乎没有评估@Column“可插入=假,可更新=假”?
从本质上讲,标准的JPA方式,最佳实践或首选项在哪里放置“可插入=假,可更新=假”?