多方类中的JPA Key生成
Posted
技术标签:
【中文标题】多方类中的JPA Key生成【英文标题】:JPA Key generation in the class of the many side 【发布时间】:2011-10-21 06:10:11 【问题描述】:我是 JPA 的新手。 我想了解 JPA 在将对象持久化到数据库方面给了我什么样的帮助。 我的例子:一个 Person 类与一个 Address 类相关。每个人可以有多个 Address 。 我这样建模这个事实:
@实体 公共类人实现可序列化 @Id int id; 字符串名; @OneToMany(mappedBy="id", cascade=CascadeType.PERSIST, CascadeType.REMOVE) List我的 EmailAddress 类类似:
@实体 公共类 EMailAddress 实现 Serializable @Id @GeneratedValue (策略=GenerationType.TABLE) 整数标识; 字符串地址; //这里有我所有的getter好的。第一个问题是,当我尝试使用以下非常简单的代码来持久化一个人对象时,我得到一个外键错误:
人 p0 = 新人(); p0.setFirstName("艾伦"); p0.setId(99); //我创建一个 EMailAddress 对象,并将它添加到 Person 地址列表 EMailAddress ma = new EMailAddress(); ma.setAddress("Alan@sample.world"); p0.setEmailList(new ArrayList()); p0.getEmailList().add(ma); em.getTransaction().begin(); em.persist(p0); em.getTransaction().commit();例外:
10924 [main] 错误 org.hibernate.util.JDBCExceptionReporter - 在表 'EMAILADRESS' 上插入已导致违反外键约束 'FK95CEBD60BE95C400' 的键 (327680)。该指令已回滚。【问题讨论】:
【参考方案1】:您将 EMailAddress 的主键作为外键映射到 Person。由于没有具有 EMailAddress id 的 Person(可能是 1,因为它是 @GeneratedValue
'ed),您会看到此异常。将您的 Person 上的映射更改为:
@OneToMany(mappedBy="USER_ID", cascade=CascadeType.PERSIST, CascadeType.REMOVE)
List<EMailAddress> emailList;
它应该可以工作。显然,如果您没有 hibernate 为您创建它,请确保更新您的数据库模式。将具有外键约束的列 USER_ID 添加到 Person.ID。
【讨论】:
以上是关于多方类中的JPA Key生成的主要内容,如果未能解决你的问题,请参考以下文章
JPA Hibernate 将类中的类中的字段映射到同一个表