将@EmbeddedId表示为H2数据库的SQL

时间:2017-12-04 10:02:02

标签: java mysql sql hibernate h2

我目前正在开发一个带有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

1 个答案:

答案 0 :(得分:0)

我只使用了@EmbeddedId一次,但我认为您需要@AttributeOverrides下的@EmbeddedId

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

并从FormulePK中删除@Column注释