我已经包含了在将 JPA 类构建到显示的表模式时遇到的错误......任何人都可以指导我如何解决这个错误。以及当其中一个键实际上是外键时如何制作复合键。我的注释有什么问题?
错误
org.apache.openjpa.util.MetaDataException:类型“class Specialty”指定的id类与类的主键字段不匹配。 确保您的身份类具有与持久类型相同的主键,包括 pk 字段类型。不匹配的属性:“personId”
表架构
创建表位置( id int 主键, 城市 varchar(255), 状态 varchar(100), 国家 varchar(255) ); 创建表人( id int 主键, 名称 varchar(100) ); 创建表摄影师( id int 主键在删除级联上更新级联上引用 Person(id), liveIn int not null 引用 Location(id) on update cascade on delete no action ); 创建表专业( 摄影师 int 在删除级联上更新级联时引用摄影师(id), 类型枚举('肖像','风景','运动'), 主键(摄影师,类型) ); 创建表照片( id int 主键, takeAt 时间戳不为空, takeBy int 在删除时更新级联引用摄影师(id)无操作, photosedAt int 引用 Location(id) 更新级联删除无操作, 类型枚举('肖像','风景','运动') ); 创建表外观( 在删除级联上显示更新级联上的 int 引用 Person(id), isShownIn int 在删除级联上更新级联上引用照片(id), 主键(显示,isShownIn) );
课程
人.java
@实体 公共类人实现可序列化{ @ID @GeneratedValue(策略 = GenerationType.IDENTITY) 私人 int id; 私有字符串名称;
位置.java
@实体 公共类位置实现可序列化{ @ID @GeneratedValue(策略 = GenerationType.IDENTITY) 私人 int id; 私人字符串城市; 私有字符串状态; 私有字符串国家;
摄影师.java
@实体 公共类摄影师实现可序列化{ @ID @ManyToOne @Column(name = "id") 私人人personId; @ManyToOne @Column(name = "livesIn") 私人位置住在;
照片.java
@实体 公共类照片实现可序列化{ @ID @Column(name = "id") @GeneratedValue(策略 = GenerationType.IDENTITY) 私人 int id; // 外键 @ManyToOne @JoinColumn(name = "takenBy") 私人摄影师拍摄; // 外键 @ManyToOne @JoinColumn(name = "photographedAt") 私人拍摄地点; @基本(可选=假) @Column(名称=“takenAt”,可插入=假,可更新=假) @Temporal(TemporalType.DATE) 私人拍摄日期; @Enumerated(EnumType.STRING) 私有 PhotoType 类型;
照片类型
公共枚举 PhotoType { 肖像(“肖像”),风景(“风景”),运动(“运动”); 私有字符串类型; PhotoType(字符串类型){ this.type = 类型; } 公共字符串 getType() { 返回类型; } }
专业.java
导入 java.io.Serializable; 导入 javax.persistence.Column; 导入 javax.persistence.Embeddable; 导入 javax.persistence.EmbeddedId; 导入 javax.persistence.Entity; 导入 javax.persistence.EnumType; 导入 javax.persistence.Enumerated; 导入 javax.persistence.Id; 导入 javax.persistence.JoinColumn; 导入 javax.persistence.ManyToOne; 导入 javax.persistence.OneToMany; 导入 javax.persistence.OneToOne; @实体 公共类专业实现可序列化{ @EmbeddedId 受保护的SpecialtyPK专业PK; 公共专业(){ 极好的(); } 公共专业(SpecialtyPK specialPK){ 极好的(); this.specialtyPK = 专业PK; } } @可嵌入 类 SpecialtyPK 实现可序列化 { @ManyToOne @Column(name = "id") 私人摄影师 personId; @Enumerated(EnumType.STRING) 私有 PhotoType 类型; /* *(非 Javadoc) * * @see java.lang.Object#hashCode() */ @覆盖 公共 int hashCode() { 最终 int 素数 = 31; 整数结果 = 1; 结果 = 素数 * 结果 + ((personId == null) ? 0 : personId.hashCode()); 结果 = 素数 * 结果 + ((type == null) ? 0 : type.hashCode()); 返回结果; } /* *(非 Javadoc) * * @see java.lang.Object#equals(java.lang.Object) */ @覆盖 公共布尔等于(对象 obj){ 如果(这 == 对象) 返回真; 如果(obj == null) 返回假; if (getClass() != obj.getClass()) 返回假; SpecialtyPK 其他 = (SpecialtyPK) obj; if (personId == null) { if (other.personId != null) 返回假; } else if (!personId.equals(other.personId)) 返回假; 如果(类型!= other.type) 返回假; 返回真; } 公共专业PK(){ 极好的(); // TODO 自动生成的构造函数存根 } public SpecialtyPK(Photographer personId, PhotoType type) { 极好的(); this.personId = personId; this.type = 类型; } }
尝试使用复合键也失败并给出了同样的错误。
很多互联网搜索还没有找到任何解决方案。