Id列的Hibernate示例

时间:2011-02-19 13:35:50

标签: hibernate

当我使用hibernate Example API时,Id列会被忽略,这非常烦人。

我有一个Table Temp(Id,Descr)和各自的实体。

我想这样做:

Temp exampleObject;
exampleObject.setId(6);
exampleObject.setDescr("six");

DetachedCriteria criteria = DetachedCriteria.forClass(exampleObject.getClass()).add(example);
....

,生成的sql看起来像这样

select this_.ID as ID0_0_, this_.DESCR as DESCR0_0_ 
from test.temp this_ where (lower(this_.DESCR)=?)

this_.ID = 6?

另一个奇怪的行为是仅使用Id:

创建示例
Temp exampleObject;
exampleObject.setId(6);

DetachedCriteria criteria = DetachedCriteria.forClass(exampleObject.getClass()).add(example);
....

生成的sql是:

select this_.ID as ID0_0_, this_.DESCR as DESCR0_0_ 
from test.temp this_ where (1=1)

为什么忽略我的Id限制?

这是我的Hibernate映射文件:

@Entity
@Table(name = "temp", catalog = "test")
public class Temp implements java.io.Serializable {

    private static final long serialVersionUID = 9123374914153833823L;

    private int id;
    private String descr;

    public Temp() {
    }

    public Temp(int id) {
        this.id = id;
    }

    public Temp(int id, String descr) {
        this.id = id;
        this.descr = descr;
    }

    @Id
    @Column(name = "ID", unique = true, nullable = false)
    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name = "DESCR", length = 45)
    public String getDescr() {
        return this.descr;
    }

    public void setDescr(String descr) {
        this.descr = descr;
    }

    @Override
    public String toString() {
        return "Temp [id=" + id + ", descr=" + descr + "]";
    }

}

3 个答案:

答案 0 :(得分:1)

在想到这个问题后,我想出了解释!没有理由有人通过示例搜索将主键添加到查找中,因为只有一个记录具有此Id,并且更简单地使用get()或load()。这就是Hibernate Example API中忽略Id列的原因。

答案 1 :(得分:0)

我认为ID是您的主键。如果是这样,你是如何在HBM文件中映射你的ID列的。 如果您将ID映射到某种Foriegn Key或Auto Generated数字或Sequence,那么您就无法设置应用程序驱动的数字来定义主键。

Hibernate是否适合你,你不必明确地说Temp.setId(9)。它会过时的。

答案 2 :(得分:0)

使用@Id时@Column是多余的,你需要添加ASSIGNED stratergy来从应用程序中分配id

@Id
@GeneratedValue(strategy = GenerationType.ASSIGNED)
public int getId() {
    return this.id;
}