我目前正在使用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
批注