java缺少hashmap_Java HashMap找不到密钥,但是应该

我的应用程序中发生一个奇怪的问题,我将快速解释全局体系结构,然后再深入探讨我的问题。

我使用一种服务来填充HashMap来自我的数据库(由JPA驱动)的数据,然后通过EJB远程方法调用(使用Apache

Wicket)将其返回到我的视图。在这一部分中,我DomainObject向返回的地图添加了一个新值,以便存储最终用户的任何新值。

当用户在其浏览器中单击“添加”按钮时,会出现问题,我尝试在地图中检索新创建的项目,但失败。通过与调试器一起玩,我面临以下问题。

假设HashMap map和DomainObject do是两个有趣的变量,我在调试器中得到以下结果

map.keySet();给我一个对应的对象do(即使@whatever simili-

reference相同),hashcode()在两个对象上返回相似的值,并且equals()在两个返回之间true

map.containsKey(do); 退货 false

map.get(do); 返回null,很奇怪,因为我的钥匙似乎在map。

假设我新创建的项目是枚举的第一个键keySet(),我执行以下操作: map.get(new

ArrayList(map.keySet()).get(0)),并且它返回null。

如果有帮助,可以通过将断点附加到我的DomainObject.equals()和DomainObject.hashcode()方法上来,我发现那map.get()只是在调用hashcode()而不是equals()。

我发现的唯一解决方法是在现有地图上重新创建一个新地图new HashMap(map),在这个新地图中,我完全可以通过其键查找对象。

我希望这里有人可以给我一个指示,谢谢。

使用环境:

OS X 10.7.1下的Sun Java 1.6.0_26 x64

Debian 6.0.2(2.6.32)下的OpenJDK 1.6.0_18 x64

Apache Wicket 1.4.17

Oracle Glassfish 3.1.1

JBoss休眠3.6.5

DomainObject 代码:

public class AssetComponentDetailTemplate extends BaseEntite {

public enum DataType {

TXT,

DATE,

INT,

JOIN,

LIST,

COULEURS,

REFERENCE

}

public enum Tab {

IDENTITE,

LOCALISATION,

CYCLE_DE_VIE,

FINANCE,

RESEAU,

DETAIL

}

@Id

@GeneratedValue(strategy = GenerationType.AUTO)

private Long id;

@Column(nullable = false)

private String name;

@Column(nullable = false)

@Enumerated(EnumType.STRING)

private DataType dataType;

private Integer classNameId;

private Long orderId;

private Long nextAssetComponentDetailTemplateId;

private String unit;

@Enumerated(EnumType.STRING)

private Tab tab;

@Column(nullable = false)

private Long uniqueOrganizationId;

@OneToMany(fetch = FetchType.LAZY)

@JoinColumn(name = "idAssetComponentDetailTemplate", insertable = false, updatable = false)

private List assetComponentDetailJoins;

private Boolean mandatory = false;

public AssetComponentDetailTemplate() {

}

public Long getId() {

return id;

}

public void setId(final Long id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(final String name) {

this.name = name;

}

public DataType getDataType() {

return dataType;

}

public void setDataType(final DataType dataType) {

this.dataType = dataType;

}

public Integer getClassNameId() {

return classNameId;

}

public void setClassNameId(final Integer classNameId) {

this.classNameId = classNameId;

}

public Long getUniqueOrganizationId() {

return uniqueOrganizationId;

}

public void setUniqueOrganizationId(final Long uniqueOrganizationId) {

this.uniqueOrganizationId = uniqueOrganizationId;

}

public Long getNextAssetComponentDetailTemplateId() {

return nextAssetComponentDetailTemplateId;

}

public void setNextAssetComponentDetailTemplateId(final Long nextAssetComponentDetailTemplateId) {

this.nextAssetComponentDetailTemplateId = nextAssetComponentDetailTemplateId;

}

public String getUnit() {

return unit;

}

public void setUnit(final String unit) {

this.unit = unit;

}

public Tab getTab() {

return tab;

}

public void setTab(final Tab tab) {

this.tab = tab;

}

public Long getOrder() {

return orderId;

}

public void setOrder(final Long order) {

this.orderId = order;

}

public Boolean isMandatory() {

return mandatory;

}

@Override

public String toString() {

return name;

}

@Override

public boolean equals(final Object o) {

if (this == o) {

return true;

}

if (o == null || getClass() != o.getClass()) {

return false;

}

final AssetComponentDetailTemplate that = (AssetComponentDetailTemplate) o;

if (classNameId != null ? !classNameId.equals(that.classNameId) : that.classNameId != null) {

return false;

}

if (dataType != that.dataType) {

return false;

}

if (id != null ? !id.equals(that.id) : that.id != null) {

return false;

}

if (name != null ? !name.equals(that.name) : that.name != null) {

return false;

}

if (nextAssetComponentDetailTemplateId != null ?

!nextAssetComponentDetailTemplateId.equals(that.nextAssetComponentDetailTemplateId) :

that.nextAssetComponentDetailTemplateId != null) {

return false;

}

if (orderId != null ? !orderId.equals(that.orderId) : that.orderId != null) {

return false;

}

if (tab != that.tab) {

return false;

}

if (uniqueOrganizationId != null ? !uniqueOrganizationId.equals(that.uniqueOrganizationId) :

that.uniqueOrganizationId != null) {

return false;

}

if (unit != null ? !unit.equals(that.unit) : that.unit != null) {

return false;

}

return true;

}

@Override

public int hashCode() {

int result = id != null ? id.hashCode() : 0;

result = 31 * result + (name != null ? name.hashCode() : 0);

result = 31 * result + (dataType != null ? dataType.hashCode() : 0);

result = 31 * result + (classNameId != null ? classNameId.hashCode() : 0);

result = 31 * result + (orderId != null ? orderId.hashCode() : 0);

result = 31 * result +

(nextAssetComponentDetailTemplateId != null ? nextAssetComponentDetailTemplateId.hashCode() : 0);

result = 31 * result + (unit != null ? unit.hashCode() : 0);

result = 31 * result + (tab != null ? tab.hashCode() : 0);

result = 31 * result + (uniqueOrganizationId != null ? uniqueOrganizationId.hashCode() : 0);

return result;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值