将 @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 查询,尝试发布您运行的测试代码! , 目标是使用CODICOGA从表中检索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

hibernate的@EmbeddedId嵌入式主键详解

使用 @EmbeddedId 映射时出现 Eclipse 错误

休眠:@EmbeddedId、继承和@SecondaryTable

我应该使用哪个注释:@IdClass 或 @EmbeddedId