Frage

Ich benutze JPA TopLink-Wesential und SQL Server 2008

Mein Ziel ist es, einen automatischen Inkrement-Primärschlüsselwert der Daten zu erhalten, die in die Tabelle eingefügt werden sollen. Ich kenne in JDBC, dass GetInserStedID () eine Methode gibt, mit der Sie die ID der automatischen Primär-ID für die automatische Inkremente geben (aber das ist nach der Ausführung der Einfügeanweisung)

In JPA fand ich es heraus @GenratedValue annotation kann den Trick machen.

@Entity
@Table(name = "tableOne")
public class TableOne implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "tableId")
    private Integer tableId;

Wenn ich nun den Code unten ausführe, sollte mir die automatische ID mir inkrementiert werden Aber es kehrt null zurück ...

 EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();
 EntityTransaction txn = em.getTransaction();
 txn.begin();

 TableOne parent = new TableOne();
 em.persist(parent); //here I assume that id is pre-generated for me.
 System.out.println(parent.getTableId()); //this returns NULL :(
War es hilfreich?

Lösung

Wir verwenden auch SQL Server 2008 und es hat nie für mich funktioniert, daher führe ich immer separate Abfrage aus "SELECT @@IDENTY" Um die eingefügte ID zu erhalten.

Der Grund, warum ich im Netz gefunden habe, war, dass die Auto -ID (Identität) von Datenbank verwaltet und nie in Entity abgerufen wird, bis Sie die Zeile nicht verpflichten oder die Informationen aus der Datenbank manuell abrufen.

Andere Tipps

Das Problem ist, dass Sie die Identitäts -ID -Generation verwenden. Die Identitäts -ID -Generierung kann keine Vorverkehrsformen durchführen, da die Einfügung die ID erstellt. Tabelle und Sequenz -ID -Generierung unterstützen die Preallocation, und ich würde immer die Verwendung dieser Verwendung empfehlen und aufgrund dieses Problems und aufgrund von Leistung niemals die Identität verwenden.

Sie können die zu generierende ID auslösen, wenn Sie die Identitäts -ID -Generierung verwenden, indem Sie Flush () aufrufen.

Mach einfach das:

public void create(T entity) {
   getEntityManager().persist(entity);
   getEntityManager().flush();
   getEntityManager().refresh(entity);
}

Nachdem Sie das Entität erfrischt haben, haben Sie das ID -Feld mit angemessenem Wert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top