将 @EmbeddedId 表示为 H2 数据库的 SQL
Posted
技术标签:
【中文标题】将 @EmbeddedId 表示为 H2 数据库的 SQL【英文标题】:Representing @EmbeddedId as SQL for H2 database 【发布时间】:2017-12-04 10:02:02 【问题描述】:我目前正在开发一个带有Hibernate 实体的Java 项目(更多内容见下文)。为了测试我的数据访问对象层,我使用H2 database 来填充内存数据库并向其抛出查询。到此为止,一切都很好。
但是,在模拟@EmbeddedId注解的时候问题就来了。
@Entity
@Table(name = "BSCOBJ")
public class BasicObject extends AbstractDomainObject
@EmbeddedId // This annotation here
private RestrainPK restrain;
@Embeddable
public static class RestrainPK implements Serializable
private static final long serialVersionUID = 1L;
@Column(name = "CODI", nullable = false)
private String coDi;
@Column(name = "COGA", nullable = false)
private String coGa;
@Column(name = "TYOR", nullable = false)
private String tyOr;
public RestrainPK()
... // Getters and setters
“简单地”创建表BSCOBJ
并填充它在获取数据时没有任何价值(当然,我检查了请求是否会“正常”给出结果)。如何在 SQL 表创建/值插入请求中表示这个嵌套类?这有可能吗?
提前致谢,
编辑
根据要求,这里有一些关于 SQL / Hibernate 运行的示例。
创建请求:
CREATE TABLE BSCOBJ (CODI VARCHAR(5) NOT NULL, COGA VARCHAR(5) NOT NULL, TYOR VARCHAR(5) NOT NULL);
插入请求:
INSERT INTO BSCOBJ (CODI, COGA, TYOR) VALUES
('HELLO', 'MAT', 'REF'),
('BONJ', 'SOME', 'DAIL'),
('SOPA', 'KDA', 'RATIO');
Hibernate 在尝试运行测试代码时给出的请求:
select r.restrain.tyOr from mypackage.BasicObject r where r.restrain.coDi = :coDi and r.restrain.coGa = :coGa
具有以下值:
coDi = "BONJ";
coGa = "SOME";
抛出一个NoResultException
。我期待DAIL
,来自INSERT
请求的第二行。
【问题讨论】:
尝试添加一段代码.. 对你不起作用的插入/查询 ok 尝试使用会话对象添加查询创建.. 所以 session.createQuery.. 等 您的查询中的TYOR
列在哪里?顺便说一句,所有 PK 字段都应包含在选择查询中,而不是发布带有数据的 hibnertae 查询,尝试发布您运行的测试代码! ,
目标是使用CODI
和COGA
从表中检索TYOR
。我会尽快发布这段代码(时间不是我这边的)
【参考方案1】:
@EmbeddedId
我只用过一次,但我认为你的@EmbeddedId
下需要@AttributeOverrides
@EmbeddedId
@AttributeOverrides(
@AttributeOverride(name = "idpk", column = @Column(name="IDPK", nullable = false),
@AttributeOverride(name = "code", column = @Column(name="CODE")
)
并从 FormulePK 中删除您的 @Column
注释
【讨论】:
以上是关于将 @EmbeddedId 表示为 H2 数据库的 SQL的主要内容,如果未能解决你的问题,请参考以下文章
将复合标识符 @EmbeddedId 与 @OneToOne 一起使用
@EmbeddedId 和 @Embeddable 中的 @GeneratedValue
使用 @EmbeddedId 映射时出现 Eclipse 错误