J'ai un problème étrange survenant dans mon application, je vais rapidement expliquer l'architecture globale, puis mon problème en profondeur.Java HashMap ne trouve pas la clé, mais il devrait
J'utilise un service pour remplir un HashMap<DomainObject,Boolean>
provenant de ma base de données (pilotée par JPA) qui est à son tour retourné à ma vue, via un appel de méthode à distance EJB (en utilisant Apache Wicket). Dans cette partie, j'ajoute un nouveau DomainObject
à la carte retournée afin de stocker toute nouvelle valeur de mon utilisateur final. Le problème se produit lorsque l'utilisateur clique sur le bouton "Ajouter" dans son navigateur, j'essaie de récupérer l'élément nouvellement créé dans ma carte, mais il échoue. En jouant avec le débogueur, je fais face aux choses suivantes.
En supposant HashMap<DomainObject, Boolean> map
et DomainObject do
sont les deux variables intéressantes, j'ai les résultats suivants dans le débogueur
map.keySet();
me donne un objet correspondant à do
(même Simili-référence @whatever est identique), hashcode()
à la fois retourne des objets valeur similaire et equals()
entre les deux rendements true
map.containsKey(do);
rendements false
map.get(do)
; renvoie null
, bizarre parce que ma clé semble être dans le map
.
En supposant que mon élément nouvellement créé est la première clé énumérée par keySet()
, je fais ce qui suit: map.get(new ArrayList(map.keySet()).get(0))
, et il renvoie null.
Si elle peut aider, en attachant des points d'arrêt à mes DomainObject.equals()
et DomainObject.hashcode()
méthodes que je trouve que map.get()
est seulement et non hashcode()
appellent equals()
.
La seule solution de contournement que j'ai trouvée est de recréer une nouvelle carte en plus de celle existante new HashMap(map)
, dans cette nouvelle carte, je n'ai aucun problème à rechercher un objet par sa clé.
J'espère que quelqu'un ici peut donner mon un pointeur sur ce qui se passe, merci.
Environnement utilisé:
- Sun Java 1.6.0_26 sous x64 OS X 10.7.1
- OpenJDK 1.6.0_18 x64 sous Debian 6.0.2 (2.6.32)
- Apache Wicket 1.4.17
- Oracle Glassfish 3.1.1
- JBoss Hibernate 3.6.5
DomainObject
Code:
public class AssetComponentDetailTemplate extends BaseEntite<Long> {
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<AssetComponentDetailJoin> 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;
}
Vous devriez montrer du code. Au moins comment vous gérez la carte ainsi que l'implémentation de 'equals' et' hashCode'. – home
Pouvons-nous voir des codes à regarder? – user482594
Je crains que l'extraction du code ne soit pas très facile (elle est étroitement couplée dans l'application). J'ajoute le code 'DomainObject'. –