java - JPA 单向一对多连接表 - 实体映射不起作用

标签 java hibernate jpa entity

我尝试为使用以下表设计的数据库创建一些 JPA 实体:PRINCIPALSCREDENTIALS,它们与其他表具有以下关系:

@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;  
}       
  • CREDENTIALSCREDENTIAL_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;
  • PRINCIPALSPRINCIPAL_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;
    
  • 最后,PRINCIPALSCREDENTIALS 具有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/

相关文章:

java - 使用方法创建对象数组

java - 当应用程序被终止或从一加 3t 手机上最近的应用程序中滑出时,Android FCM 推送通知不起作用

java - 基本类型之间的转换会导致堆分配吗?

java - 使用 Jackson 和 Hibernate 的多对多无限递归

java - 初始 SessionFactory 创建在 hibernate 错误中失败

java - 将 ElementCollection 转换为一对多关系

jpa - 通过未标记为级联 PERSIST 的关系找到了新对象

java - 查找并返回 k :th element

java - gradle springboot 和 postgresql 入门遇到问题

sql - 并发插入实体集合