RMIを介して転送されたオブジェクトのequalsに関して奇妙な問題が発生しています。これは数日間私の頭を悩ませてきました、そして私は誰かが問題にいくらかの光を当てるのを手伝ってくれるかどうか疑問に思いました。
X over RMIと呼ばれるJavaプロセスにプッシュするガレージクラス(関連する場合はJPAエンティティでもあります)があります(したがって、このオブジェクトはシリアル化されています)。Garageオブジェクトは、シリアル化可能なCar(JPAエンティティ)と呼ばれるオブジェクトのリストを格納します。
ガレージのequalsメソッドは、基本的に車のリスト(ArrayList)でequalsを呼び出しています。
Javaプロセスでequalsを呼び出すと、リスト内のすべての車でequalsを呼び出して、リストが等しいかどうかを確認するように、何らかの理由でリスト上でequalsを呼び出すことはありません。
奇妙なことに、ユニットテストでは、CarsArrayListのすべてのメンバーでequalsが呼び出されます。単体テストの一部としてオブジェクトをシリアル化することもできましたが、これも機能しました。何か案は?問題が発生していることを願っています。何かを明確にするために、情報をリクエストしてください。
編集:車のリストでequalsを呼び出す代わりに、オブジェクトでequalsを手動で実行すると、車のリストでforeachループを実行し、各Carでequalsを呼び出したため、ArrayListが奇妙であるとほぼ確信しています(ArrayListが等しいと予想したように)とにかくやることとそれは期待通りに働いた)
@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();
}
}