Transaktion abgebrochen, wenn Sie versuchen zu bestehen Benutzer
Ich bin versucht zu retten, ein Benutzer. Die Entität " Benutzer-und Gruppen-Entität verfügt über eine bidirektionale viele-zu-viele-Beziehung. Aber die Gruppen sind bereits in der Datenbank gespeichert (nur zwei aber: administrator und Benutzer).
Hier habe ich nur "fake" die Gruppe, die schon besteht, weil ich dachte, das würde funktionieren. Ich kann nicht fügen Sie die cascade = CascadeType.PERSIST
für den Benutzer, weil dann würde es speichern Sie die Gruppe wieder, verursacht doppelten Daten. Wie würde ich dieses Problem beheben?
Vom EJB -
public void persistAsUser(User user) {
Group group = new Group(2L, "user");
user.addGroup(group);
userRepository.persist(user);
}
javax.ejb.EJBException: Transaktion abgebrochen
Verursacht durch: java.lang.IllegalStateException: Während der Synchronisierung ein
neues Objekt wurde gefunden durch eine Beziehung, die nicht markiert war
cascade-PERSIST:
Hier sind die Entitäten:
@Entity
@Table(name = "app_user")
public class User implements Serializable {
public static final String ALL = "User.all";
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private Integer age;
private String username;
private String email;
private String password;
@ManyToMany(mappedBy = "users")
private List<Group> groups;
....
public void addGroup(Group group) {
if (!getGroups().contains(group)) {
getGroups().add(group);
}
if (!group.getUsers().contains(this)) {
group.getUsers().add(this);
}
}
}
und
@Entity
public class Group implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String groupName;
@ManyToMany
@JoinTable(joinColumns = {@JoinColumn(name="group_id")}, inverseJoinColumns = {@JoinColumn(name="user_id")})
private List<User> users;
....
}
Aber Tue ich das? Ich habe eine Gruppe für den Benutzer, aber ich nicht beibehalten, denn es ist bereits in der Datenbank persistiert.
legen Sie Gruppen auf null, das ist, was ich sage
Und wie würde dann der Benutzer weiß, welcher Gruppe er gehört? Wie würden JPA wissen, wie die Zuordnung der userid und groupid in der join-Tabelle?
Dann, was ich tun würde, ist das abrufen der Gruppe, der Sie den Benutzer hinzufügen möchten, fügen Sie den Benutzer hinzu, und speichern Sie die Gruppe. Sie müssen natürlich angeben, cascading für die Zusammenführung in der Gruppe -> Benutzer-Beziehung.
InformationsquelleAutor LuckyLuke | 2012-01-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieses Problem in der Regel passiert, wenn
User
) entity-verweisen auf eine nicht verwaltete (Group
).Wenn Sie nicht wollen, zu bestehen
Group
stellen Gruppen auf null, als je in meinem Kommentar.Jedoch, wenn Sie möchten, ordnen Sie den Benutzer der Gruppe, eine Möglichkeit wäre
load
dieGroup
Sie den Benutzer hinzufügen möchten,User
zu denGroup
- und Umgekehrt.merge
die GruppeDenken Sie daran, markieren Sie die Gruppe -> Benutzer-Beziehung als
CascadeType.MERGE
Ich nehme an, Hibernate weiß, wie ordnen Sie die Benutzer zu der Gruppe, wenn die Gruppe verwaltet wird - im code oben ist die Gruppe unbekannt, um Winterschlaf zu halten. In diesem Fall cascading ist nicht sinnvoll, weil Sie nicht wollen, dass die Kaskade der Gruppe, aber nur lassen wissen, Hibernate, wie der User betrifft es.
InformationsquelleAutor Gonzalo Garcia Lasurtegui
Indem Sie die mappedBy-Attribut in der User-Klasse, die Sie sagen, dass die Gruppe Klasse ist verantwortlich für die Persistenz des Vereins.
Da die Beziehung bidirektional ist, können Sie festlegen, entweder auf der Seite der besitzenden Seite der Beziehung.
Versuchen Sie, das mappedBy-Attribut der Gruppe-Klasse ManyToMany-annotation, und dann beibehalten der Benutzer, wie Sie waren.
Ich bin immer verwirrt durch mappedBy, aber ich glaube, der mappedBy-Attribut geht auf die inverse (nicht-Eigentümer) Seite der Beziehung.
das ist richtig. Es ist ein Weg, zu sagen, JPA, wo die mapping-Konfiguration für diesen Verein ist. In diesem Fall ist es richtig, wie die besitzende Seite ist vertreten durch die Benutzer-Eigenschaft in der Gruppe entity.
InformationsquelleAutor user935265