当前位置: 首页 > 面试题库 >

Hibernate双向@ManyToOne,更新不拥有的一面不起作用

巩镜
2023-03-14
问题内容

我有一个非常简单的设置,可以尝试使用注释进行双向映射:

@Entity
public class TypeA extends AbstractModel<TypeA> {

    @Id
    @GeneratedValue
    private int id;

    @OneToMany(mappedBy="a")
    private Collection<TypeB> bs;

    // Getters & Setters ... 
}

@Entity
public class TypeB extends AbstractModel<TypeB> {

    private static final long serialVersionUID = -3526384868922938604L;

    @Id
    @GeneratedValue
    private int id;

    @ManyToOne()
    @JoinColumn(name="a_id")
    private TypeA a;
}

当我设置属性TypeA.bs时,虽然应该,但它不会影响映射。请参见以下示例:

TypeB b = new TypeB();
this.typeBDao.save(b);

TypeA a = new TypeA();
a.setBs(ListUtils.createList(b));

System.out.println(a.getBs()); // output: [TypeB@25fe4d40]

this.typeADao.save(a);

System.out.println(a.getBs()); // output: [TypeB@25fe4d40]

this.typeADao.refresh(a);

System.out.println(a.getBs()); // output: []

this.typeBDao.refresh(b);
System.out.println(b.getA()); // output: null

如果映射是双向的,则应填充集合,并且应更新b的属性a,但不是。有任何想法吗?

编辑 感谢您的帮助,现在我明白了!


问题答案:

对于一致的域模型,应始终设置关系的两端,如下所示:

TypeB b = new TypeB();

TypeA a = new TypeA();
a.setBs(ListUtils.createList(b));
b.setA(a);

this.typeBDao.save(b);
this.typeADao.save(a);

当您的实体处于不一致状态时,JPA将始终根据JPA关系拥有方的对象状态存储值。在这种情况下,TypeB拥有与TypeA的关系。因此,如果TypeB的对象没有对TypeA的引用,则JPA假定未定义任何关系。



 类似资料:
  • 拥有2个实体:订单和产品。1个订单可以有多个产品,多个产品可以属于1个订单(每个产品只属于1个订单)。 尝试了@JsonIgnore。这不会返回子元素或父元素。尝试了@JsonManagedReference和@JsonBackReference-仍然没有成功。 请给我指点一下

  • 我在实体“任务”和实体“用户”之间有双向关联。 “任务”定义如下 “用户”的定义是 从两个方向访问关系很好。问题是,一旦定义了“Task”实体,我就无法更新它。 这是一个测试案例 我做错了什么?

  • 我有两个表:和。 在类中,我声明了字段,如下所示: 当我获得列表时,也被加载(我看到了许多单独的SELECT查询)。但我希望是惰性加载的,而不是与一起提取的。 对于其他表,如果引用的列是主键,则结果与预期一样(使用懒惰加载)。在我的示例中,不是表的主键,并且Hibernate不使用惰性加载。 你能告诉我怎样实现那个目标吗?

  • 嗨,我正在学习Spring JPA使用OneToMany和ManyToOne双向关系,在一些示例中,我看到OneToMany和ManyToOne关系,当我在两个方面编写时,JPA添加一个新列作为外键列,并插入父表中的键值。但当我尝试我的时候,这一栏总是空白的。下面是我的代码的样子: 下面是我的Account.java模型: 下面是我的dealer.java模型: 这里是我的控制器: 然后将JSON

  • 我有一个子类,它重写了超类的getter(因为它添加了不同的行为)。我正在使用@AttributeOverride,但它会抛出错误org.hibernate.mappingException:在com.hbmap.domain.product中也发现名称的重复属性映射。 完整StackTrace:

  • 服务 我的主要方法 所以在这里,当我尝试在students表中添加学生时,它给出了一个错误,错误是Falling