代码之家  ›  专栏  ›  技术社区  ›  James Black

当我添加OneTomany注释时,EntityManager无法使用JPA/Hibernate实例化

  •  2
  • James Black  · 技术社区  · 16 年前

    当我添加一个 OneToMany 列到已具有 单点 列。

    现在 EducationInfo 有一个 OneToOne 对于用户来说,由于每一行对一个人来说都是唯一的,但是我希望能够加载给定用户名的所有教育信息。

    添加列时,我没有更改orm.xml文件,只是删除数据库以便重新创建。

    class User {
      @Id
      @GeneratedValue(){val strategy = GenerationType.AUTO}
      var id : Int = _
    
      @Column{val nullable = false, val length=32}
      var firstName : String = ""
      var lastName : String = ""
    
      @Column{val nullable = false, val unique = true, val length = 30}
      var username : String = ""
    
      @OneToMany{val fetch = FetchType.EAGER, val cascade=Array(CascadeType.ALL)}
      var address : java.util.List[Address] = new java.util.ArrayList[Address]()
    
      @OneToMany{val fetch = FetchType.EAGER, val cascade=Array(CascadeType.ALL), val mappedBy="user"}
      var educationInfo : java.util.List[EducationInfo] = new java.util.ArrayList[EducationInfo]()
    

    如果我没有包含最后一列,那么我的单元测试工作正常,但是如果我包含这一列,那么所有的单元测试都会失败。

    这是它试图使用的类,并且该类的单元测试工作正常:

    @Entity
    @Table{val name="educationinfo"}
    class EducationInfo {
      @Id
      @GeneratedValue(){val strategy = GenerationType.AUTO}
      var id : Long = _
    
      @Column{val nullable = false, val length = 100}
      var name : String = "";
    
      @OneToOne{val fetch = FetchType.EAGER, val cascade = Array(CascadeType.PERSIST, CascadeType.REMOVE)}
      @JoinColumn{val name = "educationinfo_address_fk", val nullable = false}
      var location : Address = _
    
      @ManyToOne{val fetch = FetchType.LAZY, val cascade=Array(CascadeType.PERSIST)}
      @JoinColumn{val name = "educationinfo_user_fk", val nullable = false}
      var user : User = _
    
      @Column{val nullable = false, val length = 100}
      var degree : String = ""
    
      @Temporal(TemporalType.DATE)
      @Column{val nullable = true}
      var startyear : Date = new Date()
      var endyear : Date = new Date()
    
      @Column{val nullable = true, val length = 1000}
      var description : String = ""
    }
    

    我还想知道是否有某种方法可以知道哪些错误会阻止EntityManager被实例化,但主要问题是,当我将此列添加到用户时,可能是什么导致了问题?

    更新:

    删除了一个出错的部件。

    更新2:

    我将教育实体中的用户列更改为 @ManyToOne 我所有的单元测试都失败了。

    错误日志的结尾是:

    15035 [main] INFO org.hibernate.cfg.SettingsFactory - Default entity-mode: pojo
    15035 [main] INFO org.hibernate.cfg.SettingsFactory - Named query checking : enabled
    15047 [main] INFO org.hibernate.impl.SessionFactoryImpl - building session factory
    [PersistenceUnit: jpaweb] Unable to build EntityManagerFactory
    [PersistenceUnit: jpaweb] Unable to build EntityManagerFactory
    

    然后,EntityManager在每个测试中都为空,因此失败。

    更新3:

    这个 Address 实体没有任何外键,因为它是从多个实体调用的。

    这个问题是由使用ApacheDerby作为数据库引起的吗?

    很遗憾,我没有收到任何错误消息。我在Maven内部运行这个,虽然每次我都删除数据库,但我无法判断出发生了什么错误。来自educationinfo->用户的@manytoone不会造成任何问题,但来自用户的@onetomany->educationinfo会造成任何问题。

    更新4:

    我按照建议向用户实体添加了一个mappedby。我在另一个列定义中也有这样的定义,因为我有五个不起作用的定义,我相信它们都是出于相同的原因,所以我只是用一个进行测试。不幸的是,它仍然导致整个管理工厂没有建立,所以所有的测试都失败了。

    最后更新:

    实际情况是

    无法同时获取多个 袋子

    所以我刚从教育信息中完全删除了胎儿类型,问题就消失了。

    1 回复  |  直到 16 年前
        1
  •  3
  •   ChssPly76    16 年前

    OneToMany 在关联的另一端的补码映射是 ManyToOne 不能 OneToOne .这就是原因 EntityManager 失败。

    当您从 User 因为你只剩下 单点 Address 而且,虽然这里没有显示,大概 地址 没有一个 一对一 链接到 用户 .

    我不是Scala专家;在Java中,您通常会得到错误,并且打印堆栈跟踪时 实体管理器 初始化失败;错误消息并不总是非常描述性的,但通常会说明它有问题的映射。如果没有得到错误,可能需要调整日志设置。

    我不太明白你的模型:

    基本上,用户应该能够 有几个地址,所以我想 会变成许多人,但每一种用途 也可以有多个 教育信息,所以需要 ManyToOne。

    听起来像是来自 用户 地址 对于我和(如果“使用”意味着“用户”)作为@OneTomany来自 用户 EducationInfo .

    现在的教育信息 一对一对用户,因为每行 对一个人来说是独一无二的,但我想 能够承担所有的教育 提供用户名的信息。

    这与上述情况有冲突。或者你可以有几个 教育信息 用户 或者它是“一个人独有的”。

    推荐文章