【问题标题】:How to set the foreign key entity in Hibernate如何在 Hibernate 中设置外键实体
【发布时间】:2018-05-18 07:03:30
【问题描述】:

嗯,我是 Hibernate 的新手,我的问题很简单。我找到了几个解释它的答案,但可能是我没有完全理解它并且我仍然卡住了。

我发现要映射外键,我需要映射一个实体,如下所示

// this is GroupEntity
// mapping bond_id from Bond table
   @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name ="bond_id")
    private BondEntity bondEntity;

我相信这会将 BondEntity 表中的 bond_id 列映射到当前表的 bond_id。

现在如何在持久化该表的实体的同时将此 bond_id 设置为 DB。与其他列不同,此字段现在接受一个对象。

我尝试只设置bond_id,比如

BondEntity bondEntity = new BondEntity();
bondEntity.setBondId(1234); //remaining field of bondEntity not set
groupEntity.setBondEntity(bondEntity);

如果我继续尝试持久化这个实体,我会得到detached entity passed to persist in hibernate

什么是正确的做法。可能是我没有正确理解它。

【问题讨论】:

  • 请分享您尝试映射在一起的两个实体的代码。注释@JoinColumn 不与@OneToMany 一起使用。见JPA JoinColumn vs mappedBy
  • 您没有在单值实体字段上指定@OneToMany!那将是@OneToOne(或@ManyToOne)。
  • @pirho @JoinColumn 在 Hibernate 中与 @OneToMany 一起使用。
  • @v.ladynev 感谢您的指正。那么就不是JPA

标签: java hibernate jpa


【解决方案1】:

这是错误的

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name ="bond_id")
private BondEntity bondEntity;

也许你想用

@ManyToOne
@JoinColumn(name ="bond_id")
private BondEntity bondEntity;

请阅读本文

what is @JoinColumn and how it is used in Hibernate

这应该可行。可能你用错地方了

BondEntity bondEntity = new BondEntity();
bondEntity.setBondId(1234); //remaining field of bondEntity not set
groupEntity.setBondEntity(bondEntity);

您可以尝试使用session.load() 代替上述内容。

【讨论】:

    【解决方案2】:

    场景1:

    如果您的bond Id已经存在于会话中,您需要从会话中获取持久化对象,例如BondEntity bondEntity = session.get(BondEntity.class,1234);

    现在您可以将此持久化对象传递给 groupEntity.setBondEntity(bondEntity);

    场景 2:

    如果您需要保存新的bond id并在组表中创建相应的条目。

    创建一个 BondEntity 的实例,设置必填字段并调用 save 或 saveOrUpdate 将实体持久化到会话中,然后在组实体中设置值,hibernate 将根据两个表之间的关系处理其余部分。

    【讨论】:

      猜你喜欢
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多