hiberante通过中间关联one-to-one更新实体时的奇怪现象

来源:互联网 发布:酒店网络营销策划 编辑:程序博客网 时间:2024/05/18 03:01

hibernate 通过中间表关联的 one-to-one 关系, table a, a-c, c

A实体

public class A{

...

private C c;

@OneToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER,optional=true)
@JoinTable(name ="a-b",joinColumns =@JoinColumn(name="a.id",nullable=true),
inverseJoinColumns =@JoinColumn(name="c.id",nullable=true))
public C getC() {
return c;
}

....

}

C实体

public class C{

...

private A a;

@OneToOne(mappedby="c",optional=true)
public A getA() {
return a;
}

....

}

更新A实体,update(a) 时,使用 getHibernateTemplate().merge(a)方法,

刚开始报 not-null property references a null or transient value错误

后检查发现是 C实体中mapped的属性 a为null, 需要 c.setA(a) 一下, 再 update(a),更新成功,

但是代码看起来很奇怪, 按道理应该是由A方维护的关系, 为什么hibernate会检查 C中的a 是否为空, 而且注解配置中也写了optional = true,好像没生效..没想通.