Spring-HIbernate entity-id, bevor die Entität persistiert wird
Wie Kriege ich die id des neu persistenten Entity, bevor die Transaktion ist abgeschlossen, wenn das mit der @Transactional annotation.?
Sagen wir ich habe eine Tabelle User mit seiner id generiert wird, die durch Datenbank-Sequenz..
User.java
@Entity
public class User {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="USERSEQ")
@SequenceGenerator(name="USERSEQ", sequenceName = "USERSEQ")
@Column(name="ID", nullable=false)
private int id;
@Column(name="FIRSTNAME", nullable=false)
private String firstName;
@Column(name="LASTNAME", nullable=false)
private String lastName;
}
Ich will etwas tun, wie dies in der service Klasse.. bestehen das user-Objekt, dann bekommt man die id der Entität, fügen Sie es in das audit-Objekt und dann beibehalten.. Aber das Problem ist, dass Benutzer-Objekt ist nicht wirklich beibehalten, so dass die id Hinzugefügt, um die audit-Objekt ist nicht die Reale id des neuen Benutzers aufzeichnen.
UserService.java
@Transactional
public void addUser(User newUser, UserAudit userAudit ){
newUser = userDao.addUser(newUser);
userAudit.setUserId(newUser.getId());
userAuditDao.addUserAudit(userAudit);
}
Ich versuchte, Spülen Sie die Sitzung, bevor Sie den Benutzer-Objekt aus der dao-Schicht, aber es scheint nicht zu funktionieren...
UserDao.java
public User addUser(User user){
Session session = sessionFactory.getCurrentSession();
user = (User) session.merge(user);
session.flush();
return user;
}
Also, was muss ich hier zum abrufen von id in der service-Ebene, bevor die Transaktion abgeschlossen ist? TIA.
InformationsquelleAutor RKodakandla | 2011-11-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie wollen die Sitzung.speichern(user) oder session.saveOrUpdate(Benutzer). Nach den JavaDocs:
Ich denke, Zusammenführen, erfordert schon eine persistent entity, die ist, warum merge()/flush() nicht zu geben Sie eine. Save()/flush() sollte jedoch.
save() scheint auch nicht zu funktionieren in meinem Fall, weil die id wird generiert durch die Datenbank-Sequenz. Und diese Sequenz wird nicht generiert, bis die Transaktion tatsächlich ausgeführt
Sie nicht brauchen, um einen commit für eine Transaktion, um eine Sequenz id aus der Datenbank. (Wenn Sie in der Mitte einer Transaktion blockieren und eine save(), die Datenbank-Sequenz erzeugt die Kennung. Wenn Sie sich verpflichten, die Einlage ist verpflichtet, zusammen mit den änderungen der Reihenfolge. Wenn Sie Rollen zurück, das INSERT Rollback zusammen mit änderungen an der Reihenfolge.)
save () - merge (), die nicht brauchen, um etwas zurückzugeben. save() wandelt Ihre neu geschaffenen transientes Objekt in eine verwaltete Objekt - es fügt die generierte ID in Ihrem Objekt für Sie. Auch bin ich mir nicht so sicher, Sie brauchen, flush() - wenn ich mit Hibernate als JPA-2-provider und ich rufe EntityManager.persist() (die endet Aufruf session.persist() oder session.save()) kann ich wieder Lesen Sie die generierte ID sofort, ohne Aufruf von flush().
Ich glaube, ich fand die Ausgabe Bob.. ich musste die Strategie ändern, um GenerationType.Auto-aus-Sequenz, die seltsam ist, weil Auto sollte standardmäßig Sequenz für Oracle right? unsere Datenbank-trigger verwendet, um die nächste Sequenz Wert.. hat es etwas damit zu tun haben? Danke für Ihre Hilfe-Bob..
InformationsquelleAutor BobG