我尝试为使用以下表设计的数据库创建一些 JPA 实体:PRINCIPALS 和 CREDENTIALS,它们与其他表具有以下关系:
@Entity
@Table(name = "CREDENTIALS")
public class Credentials {
@Id
@Column(name = "CREDENTIAL_ID")
private Integer credentialID;
@Id
@Column(name = "CREDENTIAL_TYPE_ID")
private String credentialTypeID;
@OneToOne
@JoinColumn(name = "CREDENTIAL_TYPE_ID", insertable = false, updatable = false)
private CredentialTypes credentialTypes;
}
CREDENTIALS 与 CREDENTIAL_TYPES 具有 oneToOne 关系
@Entity @Table(name = "CREDENTIAL_TYPES") public class CredentialTypes { @Id @Column(name = "CREDENTIAL_TYPE_ID") private String credentialTypeID; @Column(name = "DESCRIPTION") private String description; }
@Entity
@Table(name = "PRINCIPALS")
public class Principals implements Serializable {
@Id
@Column(name = "PRINCIPAL_TYPE_ID", nullable = false)
private String principalTypeID;
@Column(name = "PRINCIPAL_ID", nullable = false)
private String principalID;
@OneToOne
@JoinColumn(name = "PRINCIPAL_TYPE_ID", insertable = false, updatable = false)
private PrincipalTypes principalTypes;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "PRINCIPAL_CREDENTIAL",
joinColumns = @JoinColumn(name = "CREDENTIAL_ID"),
inverseJoinColumns = @JoinColumn(name = "PRINCIPAL_ID"))
private List<Credentials> credentials;
PRINCIPALS 与 PRINCIPAL_TYPES 具有 oneToOne 关系
@Entity @Table(name = "PRINCIPAL_TYPES") public class PrincipalTypes implements Serializable { @Id @Column(name = "PRINCIPAL_TYPE_ID", nullable = false) private String principalTypeID; @Column(name = "DESCRIPTION") private String description;
最后,PRINCIPALS 与CREDENTIALS 具有oneToMany 关系,并使用连接表PRINCIPLE_CREDENTIAL
@Entity @Table(name = "PRINCIPAL_CREDENTIAL") public class PrincipalCredential implements Serializable { @Id @Column(name = "PRINCIPAL_TYPE_ID", nullable = false) private String principalTypeID; @Id @Column(name = "PRINCIPAL_ID", nullable = false) private String principalID; @Id @Column(name = "CREDENTIAL_ID") private Integer credentialID; @Id @Column(name = "CREDENTIAL_TYPE_ID") private String credentialTypeID;
在启动时(使用 SpringBoot),我收到主体和凭证之间的 oneToMany 关系的错误,但不知道如何修复它......尝试了各种其他方法(数据库设计无法更改)。
Caused by: org.hibernate.AnnotationException: A Foreign key refering entities.Principals from entities.Credentials has the wrong number of column. should be 2
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:502)
at org.hibernate.cfg.annotations.CollectionBinder.bindCollectionSecondPass(CollectionBinder.java:1467)
at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1233)
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:794)
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:729)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:70)
at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1697)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1426)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:85
我发现这个异常很奇怪,因为没有从凭证中引用 Principlas....
最佳答案
joinColumns/inverseJoinColumns 中缺少 PRINCIPLE_TYPE_ID 和 CREDENTIAL_TYPE_ID。我认为你必须使用@JoinColumns注释
关于java - JPA 单向一对多连接表 - 实体映射不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36043685/