【问题标题】:Hibernate @EmbeddedId休眠@EmbeddedId
【发布时间】:2015-06-28 18:13:55
【问题描述】:

这是我的问题

IdComposite类:

@Embeddable
public class IdComposite implements Serializable{

 @Column(name = "code1", nullable = false)
 private String code1;

 @Column(name = "code2", nullable = false)
 private String code2;

// getters, setters, hashCode & equals

}

MyEntity类:

@Entity
@Table(name = "table")
public class MyEntity {

 @EmbeddedId
 private IdComposite comId;

 @ManyToOne(fetch = FetchType.LAZY, cascade = {})
 @JoinColumn(name = "a_id", nullable = false, updatable = false, insertable = false)
 private A a;

 // constructors, getters setters, e t.c.

}

DaoClass片段:

MyEntity myEntity = new MyEntity();
A a = new A();
a.setId(5);
myEntity.setA(a);
IdComposite id = new IdComposite();
id.setCode1("1");
id.setCode2("2");
myEntity.setComId(id);
getSession().save(myEntity);

休眠结果:

Hibernate: 插入表 (code1, code2) 值 (?, ?) SQL 错误: 1400, SQLState: 23000 ORA-01400: 无法将 NULL 插入 “表”。“a_id”)

怎么了?

已编辑:

好的,我已经以这种方式更改了代码:

MyEntity类:

@Entity
@Table(name = "table")
public class MyEntity {

 @EmbeddedId
 private IdComposite comId;

 @Column(name = "a_id", nullable = false, updatable = false, insertable = false)
 private Long aId;

 // constructors, getters setters, e t.c.

}

DaoClass片段:

MyEntity myEntity = new MyEntity();
Long aId = 5L;
A a = (A) getSession().get(A.class, aId);
if (a == null || a.getId() != 5) { return }
myEntity.setAId(a.getId());
IdComposite id = new IdComposite();
id.setCode1("1");
id.setCode2("2");
myEntity.setComId(id);
getSession().save(myEntity);

休眠结果:

Hibernate:插入表(code1,code2)值(?,?) SQL 错误:1400,SQL 状态:23000 ORA-01400: 无法将 NULL 插入 ("TABLE"."A_ID")

已解决

问题出在这里:

, insertable = false)

所以,hibernate 生成没有导致错误的 a_id 字段的 sql

【问题讨论】:

  • 您没有将保存操作级联到 A 类。如果您不想使用级联,则应先保存 A 实体,然后再保存 myEntity

标签: java oracle hibernate


【解决方案1】:

好像不是来自复合id,而是来自A。尝试保存A实例

MyEntity myEntity = new MyEntity();
A a = new A();
a.setId(5);
a= getSession().save(a);
myEntity.setA(a);
IdComposite id = new IdComposite();
id.setCode1("1");
id.setCode2("2");
myEntity.setComId(id);
getSession().save(myEntity);

【讨论】:

  • 保存了一个实例(对不起,我在片段中错过了它)。似乎SQL是错误的。看,hibernate 尝试只插入 2 个字段。 “插入表(code1,code2)...”查询中的“a_id”在哪里?
  • 我认为休眠尝试在下一次插入之前刷新上一个命令,这就是为什么你从上一个命令中得到错误,因此“无法将 NULL 插入“表”。“a_id”)”。你能用完整的代码更新你的问题吗?
猜你喜欢
  • 2013-05-22
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 2011-12-20
  • 2020-01-05
  • 2021-11-21
  • 2016-04-28
  • 1970-01-01
相关资源
最近更新 更多