Sagen wir, ich habe zwei Objekte, sagen wir, ein Objekt ist ein Benutzer und das andere ist ein State-Objekt. Das Staatsobjekt ist im Grunde die 50 Staaten von Amerika, so dass es sich nicht ändern muss. Das Benutzerobjekt hat jedoch eine Sammlung von Zuständen, in denen der Benutzer war. So wie folgt aus:Ein Objekt aus Objekt A in Objekt B einfügen, ohne ein neues Objekt zu erstellen? HIBERNATE
@Entity
@Table(name="tbl_users")
class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id", unique=true, nullable = false)
private int id;
@Column(name="user_name")
private String name;
@OneToMany(targetEntity=State.class, orphanRemoval = false)
@Column(name="states")
private Collection<State> states;
//getters and setters
}
und die Einheit Staaten sieht wie folgt aus:
@Entity
@Table(name="tbl_states")
class State {
@Id
@Column(name="id", unique=true, nullable=false)
private int id;
@Column(name="state")
private String state;
// getters and setters
}
-Code für das Hinzufügen von Benutzer (unter Verwendung von Hibernate):
public int addUser(User user) {
em.persist(user);
em.flush();
return user.getId();
}
-Code für den Zustand von id bekommen:
public State getStateById(int id) {
return em.createQuery("SELECT s FROM State s WHERE s.id =:id, State.class)
.setParameter("id", id)
.getSingleResult();
}
aber wenn ich es versuche ein Benutzer erstellen und mehrere Staaten holen, erhalte ich eine PSQLException:
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "uk_g6pr701i2pcq7400xrlb0hns"
2017-06-21T22:54:35.959991+00:00 app[web.1]: Detail: Key (states_id)=(5) already exists.
Ich habe versucht, die Cascade Methoden suchen, um zu sehen, ob ich verwenden könnte, aber Cascade.MERGE und Cascade.PERSIST scheinen das Gleiche zu tun, und der Rest glaube ich nicht (REMOVE, DETACH, etc). Meine Frage ist: Wie füge ich Zustände zum Benutzerobjekt hinzu, ohne diesen Fehler zu haben?
Wie rufen Sie Ihre Statusobjekte ab, bevor Sie sie Ihrem Benutzerobjekt hinzufügen? –
@AbassA Ich mache eine getStateById() für jedes und es gibt das state-Objekt in eine Array-Liste zurück, und dann füge ich diese Array-Liste mit der Setter-Methode – Aria
dem Benutzer hinzufügen Könnten Sie den vollständigen Code, wo Sie die Speichermethode verarbeiten . Warum haben Sie eine @Column-Funktion über Ihrem Sammelattribut, die Sie nicht benötigen, und ich stelle mir vor, dass Sie eine Tabelle user_state haben, die die Beziehung unterstützt? –