Ich habe einige Entity-Klassen, die eine Eins-zu-viele - viele-zu-eins-Beziehung haben. Ich benutze Spring und Hibernate.Spring Data JPA Hibernate - Zusätzliche Elemente in der Beziehung @ManyToOne
Jede TwoWayService
hat genau 2 Service
s in meiner Anwendung.
Auszüge:
@Entity
@Table(name = "two_way_services")
public class TwoWayService {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column
private String name;
@OneToMany(cascade = CascadeType.ALL,
mappedBy = "twoWayService",
fetch = FetchType.EAGER)
private List<Service> services;
public TwoWayService() {
services = new ArrayList<>();
// Add two as default
services.addAll(Arrays.asList(new Service(), new Service()));
}
public void setService1(Service service) {
services.set(0, service);
service.setTwoWayService(this);
}
public void setService2(Service service) {
services.set(1, service);
service.setTwoWayService(this);
}
...
}
@Entity
@Table(name = "services")
public class Service {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column
private String name;
@ManyToOne(optional = false)
@JoinColumn
private TwoWayService twoWayService;
public void setTwoWayService(TwoWayService twoWayService) {
this.twoWayService = twoWayService;
}
...
}
ich auf der Back-End-Derby verwenden. Das Datenbankschema ist wie folgt:
CREATE TABLE two_way_services (
id INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
config_name VARCHAR(255) NOT NULL,
name VARCHAR(80),
admin_ip VARCHAR(32) NOT NULL,
connection_state INT NOT NULL
);
CREATE TABLE services (
id INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
name VARCHAR(80),
type INT NOT NULL,
ruleset VARCHAR(255) NOT NULL,
two_way_service_id INT,
FOREIGN KEY (two_way_service_id) REFERENCES two_way_services(id) ON DELETE CASCADE
);
Die Repository-Schnittstelle:
public interface TwoWayServiceRepository extends Repository<TwoWayService, Integer> {
<S extends T> S save(S entity);
...
}
In meinen Unit-Tests, finde ich, dass, wenn ich findOne
auf einem TwoWayService
nennen, finde ich, dass ich 4 Services
statt 2. Beim Durchsuchen der Datenbank werden die Daten direkt angezeigt, wie ich es erwarten würde.
TwoWayService tws1 = repo.findOne(1); // get by id
assertThat(tws1.getServices().size()).isEqualTo(2); // fails, expected:<[2]> but was:<[4]>
es im Debugger Prüfungs Ich sehe 4 Elemente in der services
Liste: die beiden, die ich erwarte, 2 zusätzliche diejenigen, die Kopien sind zu erwarten. Ich sehe nicht, woher diese kommen. Warum erscheinen diese zusätzlichen Objekte in der Liste?
Ich rufe 'List.set' in den Setter, die nur das Element am angegebenen Index ersetzt. 'List.add' würde ein neues hinzufügen. Es ist seltsam, die Elemente 0 und 1 in der Liste sind die Service1-Objekte und die Elemente 2 und 3 sind das Service2-Objekt. Ich habe versucht, nicht die Standards im Konstruktor, aber das gleiche Ergebnis zu erstellen. – AlanW