【问题标题】:Hibernate Annotation - 1 to 1 with no auto_incrementHibernate Annotation - 1 到 1,没有 auto_increment
【发布时间】:2013-01-23 19:06:29
【问题描述】:

当一个表的主键列是另一个没有 auto_increment (MySQL) 的表的外键时,我该如何处理 Hibernate Annotation (JPA)。

谢谢。

【问题讨论】:

    标签: java hibernate jpa annotations persistence


    【解决方案1】:

    类似下面的东西应该可以工作(没有测试确切的语法,但应该很接近):

    @Id
    private int id;
    
    @OneToOne
    @JoinColumn(name = "id", updatable = false, insertable = false)
    private RelationEntity other;
    

    您需要在持久化之前手动设置“id”字段,并且不记得是否可以在初始保存之前设置“其他”实体,如果您这样做,休眠可能会抱怨。但是,如果设置了“id”列,那么当您重新加载实体时,您也应该加载关系。

    【讨论】:

    • 想到的第一种方法是,在我持久化“id”字段之前,我会通过来自 A a 的“max(a.id)”从另一个表中检索最后一个持久化的“id” " hql + 1,然后,我通过它的 Setter 方法设置了 "id" 值。我会尽力让你知道。谢谢。
    • 你身边有其他实体对象吗?它是在您保存此实体之前、之后还是期间持续存在?听起来如果您在事务中执行此操作会最简单,那么您可以这样做:em.persist(other);其他.getId();不用担心 max(a.id) 的事情
    • 两者同时保存(不是同时,你知道。Hibernate 的引擎会小心)因为持有 FK 的实体将另一个实体作为其字段(例如 a.setB(b) ) 带有适当的注释“标记”(@OneToOne、@JoinColumn 和 @Cascade)。因为 Hibernate save() 方法被使用一次来持久化 A 实体。我说清楚了吗?
    • 我尝试了我的建议,因为我将 format_sql 设置为 true,所以我在这里看到的只是包含 FK 的实体的 SQL“插入”语句(如上所述的实体)。长话短说……没用。即使在持久化对象之前使用 hql (max()...) 通过 setter 设置 A id 的字段,hibernate 也会抛出 MySQL 异常警告约束错误(无法添加或更新子行:...)。即使 A 实体有 B 实体,我也应该坚持 B 实体吗?顺便提一下(虽然我认为这与此无关),它是一个 JSF 项目。
    • 我想我明白你在说什么,并且不确定它是否可以通过一次调用来持久化,即使设置了级联值。要查看映射是否有效,请尝试调用持久化(有点痛苦,但只是为了测试): em.perist(other);依赖的.setId(other.id); em.persist(依赖);显然最好在事务中执行此操作,但它至少应该证明映射是正确的,并且 hibernate 可以在此级别处理它,然后继续尝试让它自动发生。
    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 2012-06-30
    • 2012-11-20
    • 1970-01-01
    • 2012-03-10
    • 2015-07-24
    • 2015-11-07
    • 2021-09-29
    相关资源
    最近更新 更多