我目前正在使用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请求的第二行。

最佳答案

我只使用过@EmbeddedId一次,但是我认为您需要在@AttributeOverrides下使用@EmbeddedId

@EmbeddedId
@AttributeOverrides({
    @AttributeOverride(name = "idpk", column = @Column(name="IDPK", nullable = false),
    @AttributeOverride(name = "code", column = @Column(name="CODE")
})


并从FormulePK中删除您的@Column批注

09-30 14:59