Ява, если долго не работает - PullRequest
0 голосов
/ 08 января 2011

действительно странная ситуация, я попал сюда. У меня 2 класса.

  
@Entity
public class CategoryData extends EntityData {
    public Long parentId;

    @Column(unique=true)
    public String name;
    public Picture picture;
}
  
@Entity
public class PropertyGroupData extends EntityData {
    public Long categoryId;
    public String adminDescription;
    public String title;
    @ManyToMany(fetch=FetchType.EAGER)
    public List properties = new LinkedList();

}

это класс сущностей для моего спящего режима.

 
@MappedSuperclass
public class EntityData implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long id;
    @Temporal(TemporalType.TIMESTAMP)
    public Date created = new Date();
    @Temporal(TemporalType.TIMESTAMP)
    public Date modified = new Date();

    public Long version =  0L;
    // W:waiting,A:active,D:deleted
    public Character status;

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE);
        //return "EntityData[id=" + id + "]";
    }
}

здесь приходит ситуация. Я получил некоторые данные в моей базе данных, и она работает хорошо. до сих пор.


for(CategoryData c:kategoriler)
    if(pgd.categoryId.toString().equals(c.id.toString()))
        out.print("1-find equal "+c.id);
for(CategoryData c:kategoriler)
    if(pgd.categoryId==c.id)
        out.print("2-find equal "+c.id);

первый цикл for работает нормально и печатает 1-найти равным 7, но второй цикл ничего не печатает. они оба длинные. что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 08 января 2011

Выражения имеют тип Long, который является классом, и поэтому сравниваются с помощью ссылочного идентификатора . Если бы они были long, было бы хорошо. Попробуйте вместо этого:

for(CategoryData c:kategoriler)
    if(pgd.categoryId.longValue() == c.id.longValue())
        out.print("2-find equal "+c.id);
1 голос
/ 08 января 2011

Поскольку Long переопределяет .equals, вы можете использовать метод .equals (), как и в случае со строками.

for(CategoryData c:kategoriler)
{
  if (pgd.categoryId.equals(c.id))
  {
      out.print("2-find equal "+c.id);
  }
}

Использование == просто сравнивает ссылки на объекты.

1 голос
/ 08 января 2011

Вы сравниваете 2 объекта по ссылке. То есть вы проверяете, являются ли они ссылками на один и тот же объект. Вам нужно проверить, имеют ли они одинаковые значения, например,

if(pgd.categoryId.longValue() == c.id.longValue())
...