java - hibernate @EmbeddedId

标签 java oracle hibernate

这是我的问题

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 结果:

Hibernate: insert into table (code1, code2) values (?, ?) SQL Error: 1400, SQLState: 23000 ORA-01400: cannot insert NULL into "table"."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 结果:

Hibernate: insert into table (code1, code2) values (?, ?) SQL Error: 1400, SQLState: 23000 ORA-01400: cannot insert NULL into ("TABLE"."A_ID")

已解决

问题出在这里:

, insertable = false)

因此,hibernate生成没有a_id字段的sql,导致错误

最佳答案

它似乎不是来自复合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);

关于java - hibernate @EmbeddedId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29774672/

相关文章:

java - Arquillian和Flyway使用不同版本的H2内存

java - 使用 Maven 从类中运行 main

sql - 您如何防止 Oracle 的基于成本的优化器进行糟糕的优化?

java - Hibernate 过滤器的默认条件

Hibernate 资源池关闭过早

java - 字符串拆分功能未按预期工作

java - 将日期字符串解析为 java.util.Date 时出现非法模式字符 'T'

oracle - 每组最大的行 - 进一步将结果集与左连接与 Hibernate 中的其他相关表相结合 - HQL。是否可以?

c# - 使用 SQL 存储函数给出无效的 SQL 语句

java - ...hbm.xml 文件在哪里?