【问题标题】:Exception with JPA/Hibernate when binding my entities to tables with @OneToMany annotation将我的实体绑定到带有 @OneToMany 注释的表时出现 JPA/Hibernate 异常
【发布时间】:2015-12-04 04:14:02
【问题描述】:

Spring 例外。当我尝试使用@OneToMany 注释将我的实体绑定到表时。

引起:org.hibernate.AnnotationException:@OneToOne 或 @ManyToOne 在 com.wumf.iModuleSyncApps.impl.IAppEntity.packageName 上引用了一个 未知实体:java.lang.String at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:109) 在 org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1598) 在 org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1521) 在 org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1422) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852) ... 41 更多

@Entity
@Table(name = "IApp")
public class IAppEntity {

    @ManyToOne
    @JoinColumn(referencedColumnName="packageName")
    @Id
    private String packageName;

    private String icon;

    private String name;

    public String getPackageName() {
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }

    public String getIcon() {
        return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

@Entity
@Table(name = "IAppsFriends")
public class IAppsFriends {

    @GeneratedValue
    @Id
    private int id;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "packageName")
    private List<IAppEntity> apps;

    private String phone;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public List<IAppEntity> getApps() {
        return apps;
    }

    public void setPackageName(List<IAppEntity> apps) {
        this.apps = apps;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

}

我还尝试将@JoinColumn(referencedColumnName="packageName") 更改为 @JoinColumnn(name="packageName") 无济于事。

【问题讨论】:

    标签: java spring hibernate jpa


    【解决方案1】:

    您的@ManyToOne 注释放错了位置。当您应该注释 IAppsFriends 时,您正在注释 String 变量:

    @Table(name = "IApp")
    public class IAppEntity {
    
        @Id
        private String packageName;
    
        @ManyToOne
        @JoinColumn(referencedColumnName="packageName")
        private IAppsFriends friends;
    
        // ... rest of code
    
    }
    

    您还应该更改IAppsFriends 类以修复mappedBy 属性:

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "friends")
    private List<IAppEntity> apps;
    

    【讨论】:

    • 谢谢,你真的帮了我! =)
    【解决方案2】:

    如果要添加从IAppEntityIAppsFriends 的OnwToMany 关系,则应将IAppsFriends 的id 存储在表IApp 中。 IAppsFriends.id 的类型是 int。所以我认为你应该得到一个像friends int(11) not null 这样的正确连接列。

    那么JPA就会依赖列friends的值来获取实例IAppsFriends。

    @Table(name = "IApp")
    public class IAppEntity {
    
    @Id
    private String packageName;
    
    @ManyToOne
    @JoinColumn(referencedColumnName="id")
    private IAppsFriends friends;
    
    // ... rest of code
    
    }
    

    PS:referencedColumnName表示anther表中的引用。所以值应该是id(列friends的值应该是IAppsFriends的id之一)

    当然IAppsFriends中的代码应该修改为:

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "friends")
    private List<IAppEntity> apps;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-27
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      相关资源
      最近更新 更多