OneToMany
当我将列添加到已经有列的类时,我一直在努力无法实例化 EntityManager 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 实例化的错误是什么,但主要问题是当我将此列添加到 User 时可能导致问题的原因是什么?
更新:
删除了错误的部分。
更新 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
实体没有任何外键,因为它是从多个实体调用的。
使用 Apache Derby 作为数据库是否会导致此问题?
不幸的是,我没有收到任何错误消息。我从 Maven 中运行它,虽然每次我都删除数据库,但我不知道发生了什么是错误的。EducationInfo -> User 中的 @ManyToOne 不会引起任何问题,但 User 中的 @OneToMany -> EducationInfo 会引起任何问题。
更新 4:
我按照建议向 User 实体添加了 mappedBy。我在另一个列定义中有这个,因为我有五个不起作用的定义,而且我相信它们都是出于相同的原因,所以我只是用一个进行测试。不幸的是,它仍然导致 EntiyManagerFactory 没有被构建,所以所有的测试都失败了。
最后更新:
实际情况是
不能同时取多个包
所以我刚刚从 EducationInfo 中完全删除了 FetchType,问题就消失了。