当前位置: 首页 > 知识库问答 >
问题:

添加到@ManyToOne[副本]时更新父引用

何兴学
2023-03-14

让我们假设一个简单的1父亲-

@Entity
public class Father {

    @Id
    @GeneratedValue
    private Integer id;

    @OneToMany(mappedBy="father", cascade=CascadeType.ALL)
    private List<Child> children = new ArrayList<>();

    ...
}

@Entity
public class Child {
    @Id
    @GeneratedValue
    private Integer id;

    @ManyToOne(cascade=CascadeType.ALL)
    private Father father;

    ...
}

当现在试图通过简单地将孩子添加到父亲来更新这种关系时,它不起作用,因为Child.father不会更新:

Child child = new Child();
// optionally persist child first, tried
father.getChildren().add(child);
...save father

我尝试使用不同的CascadeTypes,但似乎没有什么可以自动更新Child.father引用。我知道传统的方法是使用“addUNICEF”方法,但我想知道是否有自动方法可以做到这一点?

我的配置是Spring Boot JPA(Hibernate)H2,自动创建到数据库。有趣的是,我发现一些博客帖子似乎与我在这里所做的完全一样,但对他们来说它有效,但对我来说却不行。奇怪。

共有1个答案

扶隐水
2023-03-14

是的,但不是故意的。我之所以真正解释它,是因为它可能解释了你在那些博客文章中看到的东西。通过删除mappedBy并添加@JoinColumn,可以将@OneToMany设置为关系的拥有方。但是,这主要是针对没有反向引用的情况。如果保留@ManyToOne,则Hibernate将看到两个碰巧共享相同列的关系。然而,据我所知,它应该是有效的。

我曾经见过一个不合理的引用,它可能会导致性能问题,但我再也找不到那个引用了,所以我不确定。这将有两个问题,即如何证明该选项的“这并不是你应该怎么做”性质:

  1. 在事务/会话关闭且子实体从数据库重新加载之前,父字段不会更新

您可以使用动态代理和反射来实现这一点,尽管您必须通过DAO/存储库来控制实体的创建,以确保它们得到代理。

最后我个人是不会推荐的,越老越觉得你的应用里面的黑魔法越少越好。

 类似资料:
  • 我已经看到了这个答案,并且正在使用它所建议的解决方案,但仍然得到相同的错误。 我有一个对用户表有外键约束的代理表,这是代理表: 这是我的实体: 现在,我想为现有用户添加一个新代理: <代码>\u上下文。SaveChanges() 行引发以下异常: "无法添加或更新子行:外键约束失败(\"dbName\".\"agent\", CONSTRAINT\"FK_Agency_User\"FOREIGN

  • 问题内容: 我正在尝试创建一个简单的程序来管理员工。尝试添加新员工时,我似乎无法让该员工显示在Jlist上。 主机… 添加员工的对话… 这就是我用来添加员工的方法 我认为这是正确的方法,但似乎无效。任何帮助将不胜感激。 问题答案: 有两个问题, 第一个: 不好:。使用equals(…)或equalsIgnoreCase(…)。理解检查是否绝对不是您感兴趣的 引用 相等性。您需要 函数 相等性,这是

  • 如何将svg添加到我的网页并通过css更改其颜色? 我试过: 但是运气不好。 请只提供CSS解决方案,我不需要任何后备,只支持新的浏览器。

  • 本文向大家介绍svn 更新工作副本,包括了svn 更新工作副本的使用技巧和注意事项,需要的朋友参考一下 示例 您不是唯一从事此项目的人,对吗?这意味着您的同事也正在对项目数据进行修改。为了保持最新状态并获取其他人所做的修改,您应该svn update在工作副本中运行command。因此,您的工作副本将与存储库同步并下载同事所做的更改。 的简写svn update是svn up。 这是svn upd

  • 我在Android开发,切换到API22后,我开始在我的应用程序中有错误。在stackoverflow上搜索,我找到了解决方案,获得了最新版本的appcompat_v7。 我怎么继续?我可以在哪里下载最新版本或在哪里更新它?

  • WooCommerce插件添加到购物车每件物品更多的费用。 客户在购物车中选择以下内容: 产品A(大项目)-300美元 产品B(大项目)-500美元 产品C(普通项目)-30美元 产品D(普通商品)-10美元 让我们假设“大项目-正常项目”的规则如下: 大件商品-收费: 20美元/件 正常项目-收费:低于150美元,免费送货;超过150美元,将收取20美元的费用 如何让它自动当点击添加到购物车按钮