当我运行春季启动项目时,我会收到以下错误" init方法的调用失败;嵌套异常是org.hibernate.annotationException:未针对实体指定标识符:"
我还有其他几个带有多个主键和外键的课程,但它们没有遇到错误。
import javax.persistence.*;
@Entity
@Table(name="roles_has_features")
public class RoleFeatures {
@Column(name = "role_id_fk")
private Long roleIdFk;
@Column(name = "feature_id_fk")
private Long featureIdFk;
public Long getRoleIdFk() { return roleIdFk; }
public void setRoleIdFk(Long roleIdFk) { this.roleIdFk = roleIdFk; }
public Long getFeatureIdFk() { return featureIdFk; }
public void setFeatureIdFk(Long featureIdFk) { this.featureIdFk = featureIdFk; }
}
这实际上与春季无关。这是Hibernate引发的错误,因为JPA规范需要每个实体的身份。至于您的情况,我不建议创建一个单独的实体,因为据我从您的列名中了解,这只是角色和功能表之间关系的映射。我建议对JPA多一对一的关系。看一下@ManyToMany
和@JoinTable
注释。
这对我来说是一个非常好的教程
冬眠 - 多一对示例
错误消息很好地描述了问题:
未针对实体指定的标识符
您的RoleFeatures
实体中没有@Id
注释的列。因此,Hibernate无法识别数据库中的实体并拒绝启动。
您所谓的实体看起来更像是一种多对多的关系。也许最好这样。
类似的东西:
@Entity
public class Role {
@Id
@Column(name = "role_id")
private Long id;
@ManyToMany
@JoinTable(name = "roles_has_features",
joinColumns = @JoinColumn(name = "feature_id_fk", referencedColumnName = "feature_id"),
inverseJoinColumns = @JoinColumn(name = "role_id_fk", referencedColumnName = "role_id"))
private List<Feature> features;
...
}
另请参见:https://www.baeldung.com/jpa-many-to-many