Я столкнулся со странной проблемой, связанной с равными для объекта, передаваемого через RMI. Уже несколько дней это ломает мне голову, и мне было интересно, может ли кто-нибудь помочь пролить свет на проблему.
У меня есть класс Garage (который также является сущностью JPA, если это имеет значение), который я нажимаю на java-процесс под названием X через RMI (так что этот объект сериализуется). Объект Garage хранит список объектов с именем Car (также объекты JPA), которые также являются сериализуемыми.
Метод equals в Garage в основном вызывает equals в своем списке автомобилей (ArrayList).
Когда я вызываю equals в java-процессе, он по какой-то причине не вызывает equals в списке, как я ожидаю, я ожидаю, что он вызовет equals для всех автомобилей в списке, чтобы проверить, равны ли списки, он этого не делает.
Странно то, что при модульном тестировании он вызывает equals для всех членов Cars ArrayList. Я даже сериализовал объекты как часть модульного теста, и это тоже сработало. Любые идеи? Надеюсь, я разобрался с проблемой, не стесняйтесь запрашивать любую информацию, чтобы что-то уточнить.
Редактировать: я почти уверен, что его 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();
}
}