在通过 RMI 传输的对象上,我遇到了一个与 equals 相关的奇怪问题。这已经让我头疼了几天,我想知道是否有人可以帮助阐明这个问题。
我有一个车库类(如果它相关,它也是一个 JPA 实体),我将它推送到一个名为 X over RMI 的 java 进程(所以这个对象正在被序列化)。Garage 对象存储了一个名为 Car 的对象列表(也是 JPA 实体),这些对象也是可序列化的。
Garage 上的 equals 方法基本上是在其汽车列表(一个 ArrayList)上调用 equals
当我在 java 进程中调用 equals 时,由于某种原因,它不会像我期望的那样在列表上调用 equals,我希望它会在列表中的所有 Cars 上调用 equals 以检查列表是否相等,但它不会这样做。
奇怪的是,当单元测试时,它确实对 Cars ArrayList 的所有成员调用 equals。我什至将这些对象序列化为我的单元测试的一部分,这也很有效。有任何想法吗?我希望我能解决问题,随时要求任何信息来澄清任何事情。
编辑:我几乎可以肯定它的 ArrayList 很奇怪,因为当我在我的对象中手动执行 equals 而不是在汽车列表上调用 equals 我在汽车列表上做了一个 foreach 循环并在每辆汽车上调用 equals (就像我预期的 ArrayList equals无论如何都要做,它按预期工作)
@Entity
@Table(schema="pdw", name="garage")
public class Garage
implements Comparable<Garage> ,
Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;
private String name;
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(schema="pdw")
private List<Car> cars = new ArrayList<Car>();
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Car> getCars() {
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
@Override
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append("[");
buffer.append("Garage:");
buffer.append("[id:" + id + "]");
buffer.append("[Cars:" + cars + "]");
buffer.append("]");
return buffer.toString();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Garage))
return false;
Garage other = (Garage) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (cars == null) {
if (other.cars != null)
return false;
} else if (!cars.equals(other.cars))
return false;
return true;
}
@Override
public int compareTo(Garage other) {
return this.getName().compareTo(other.getName());
}
}
@Entity
@Table(schema="pdw", name="car")
public class Car
implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;
private String name;
@OneToOne(fetch = FetchType.LAZY)
private Garage garage;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Garage getGarage() {
return garage;
}
public void setGarage(Garage garage) {
this.garage = garage;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Car other = (Car) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append("[");
buffer.append("Car:");
buffer.append("[id:" + id + "]");
buffer.append("[name:" + name + "]");
buffer.append("[garage:" + garage.getName() + "]");
buffer.append("]");
return buffer.toString();
}
}