2012-10-08 39 views
0

我有一个用户DAO休眠给出两行相同的,而不是两个不同的行

@Entity 
@Table(name="EBIGUSERTIM") 
public class EbigUser { 


private String id; 
private Integer source; 
private String entryscheme; 
private String fullName; 
private String email; 

private Long flags; 
private String status; 
private String createdBy; 
private Date createdStamp; 
private String modifiedBy; 
private Date modifiedStamp; 

@Id 
@Column(name="ID") 
public String getId() { 
    return id; 
} 
public void setId(String id) { 
    this.id = id; 
} 
@Id 
@Column(name="SOURCE") 
public Integer getSource() { 
    return source; 
} 
public void setSource(Integer source) { 
    this.source = source; 
} 
@Column(name="ENTRYSCHEME") 
public String getEntryscheme() { 
    return entryscheme; 
} 
public void setEntryscheme(String entryscheme) { 
    this.entryscheme = entryscheme; 
} 
@Column(name="FULLNAME") 
public String getFullName() { 
    return fullName; 
} 
public void setFullName(String fullName) { 
    this.fullName = fullName; 
} 
@Column(name="EMAIL") 
public String getEmail() { 
    return email; 
} 
public void setEmail(String email) { 
    this.email = email; 
} 
@Column(name="FLAGS") 
public Long getFlags() { 
    return flags; 
} 
public void setFlags(Long flags) { 
    this.flags = flags; 
} 
@Column(name="STATUS") 
public String getStatus() { 
    return status; 
} 
public void setStatus(String status) { 
    this.status = status; 
} 
@Column(name="CREATEDBY") 
public String getCreatedBy() { 
    return createdBy; 
} 
public void setCreatedBy(String createdBy) { 
    this.createdBy = createdBy; 
} 
@Column(name="CREATEDSTAMP") 
public Date getCreatedStamp() { 
    return createdStamp; 
} 
public void setCreatedStamp(Date createdStamp) { 
    this.createdStamp = createdStamp; 
} 
@Column(name="MODIFIEDBY") 
public String getModifiedBy() { 
    return modifiedBy; 
} 
public void setModifiedBy(String modifiedBy) { 
    this.modifiedBy = modifiedBy; 
} 
@Column(name="MODIFIEDSTAMP") 
public Date getModifiedStamp() { 
    return modifiedStamp; 
} 
public void setModifiedStamp(Date modifiedStamp) { 
    this.modifiedStamp = modifiedStamp; 
} 

我正在选择出来的分贝的2行。 sql works

select * from ebigusertim where id='blah' 

它返回2个不同的行。当我使用hibernate查询数据时,似乎没有为列表中的每个条目分配对象内存。因此,我得到了与同一个对象的列表中的2个条目。

 Criteria userCriteria = session.createCriteria(EbigUser.class); 
     userCriteria.add(Restrictions.eq("id", id)); 
     userlist = userCriteria.list(); 
+0

请为您的问题选择一个更好的标题,标题中的“问题”被禁止使用堆栈溢出,并且设法潜入其中的唯一原因是因为您对程序员提出此问题,如果您尝试过,系统会自动拒绝在Stack Overflow上询问这个问题。一个更具描述性的标题将帮助您获得更好的答案,并尽可能针对实际问题制定标题。而当你处理它时,你的代码格式有几个问题,我试图修复它们,但由于标题中的“问题”而无法提交编辑。请修复这些问题。谢谢。 – yannis

+0

根据您的唯一列组合合适地重写equals和hashcode方法 –

回答

1

你为什么要定义两个id列(包括idsource映射与注释@Id)?

@Id 
    @Column(name="ID") 
    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 
    @Id 
    @Column(name="SOURCE") 
    public Integer getSource() { 
     return source; 
    } 

请删除一个,如果是错误的。如果两者一起制造composite key,则相应地映射它们,例如,

@Embeddable 
    public class UserPK implements Serializable { 

    @Column(name = "ID", nullable = false) 
    private String id; 

    @Column(name = "SOURCE", nullable = false) 
    private Integer source; 

    ..... 
    ..... 
    } 


Use this new class in you original class as Id as below: 

    @EmbeddedId 
    private UserPK userPK; 

希望这会有所帮助。

+0

我添加了第二列,因为唯一性在id和source上。我最初使用的只是身份证,我得到了相同的结果。第二个ID注释似乎并不重要。我确实看到了像你这样放置的复合键的例子。我会补充一点。由于我是hibernate的新手,你认为这会解决我的问题吗? – sydncall

+0

单向或双向。如果'source'是主键,则从'getId()'中移除'@ Id'注释。如果两个字段一起是组合键,则使用组合键映射。 –

+0

我创建了组合键(Embeddable和EmbeddedId)并解决了我的问题。谢谢您的帮助! – sydncall

相关问题