Wie zu vermeiden, erstellen eine neue Zeile, wenn ähnliche Zeile vorhanden ist?
Muss ich konfigurieren Sie den Ruhezustand, um zu vermeiden, doppelte Zeilen (obwohl die Zeile vorhanden ist, erstellt es eine neue, und da nur ein Feld gesetzt, alle rest auf NULL)
Können sagen, ich habe eine Zeile wie folgende
id des index age
1 MyName 2 23
Obwohl ich nur set MyName als des und es bereits in der Name der Tabelle überwintern
erstellen Sie eine neue Zeile wie die folgende
id des index age
1 MyName 2 23
2 MyName Null Null << new row with null values will be created
rather than updating the previous one
Kann, wenn ich möchte sa
.
So habe ich die folgende Anmerkung zu meiner Klasse, doch es überquerte die Entität, und dynamicUpdate.
@org.hibernate.annotations.Entity(
dynamicUpdate = true
)
Ich verwendet @DynamicUpdate
so gut, obwohl hibernate akzeptieren es aber noch immer habe ich das gleiche problem.
Gibt es eine andere Methode, es zu tun ? Version von mein Ruhezustand ist wie folgt
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.1.Final</version>
<type>jar</type>
</dependency>
*Basierend auf Ray ' s Kommentar blies, Durch zuweisen eines Werts-Id der Kind-Klasse, es funktioniert einwandfrei aber wie wäre es, wenn ich nicht die ID? tun ich habe zu tun, einen zu finden, wählen Sie die id der erste ? Gibt es irgendeine Methode, um Kraft hibernate zu tun es automatisch r basierend auf den Werten der untergeordneten Klasse rahter, als bei einem separaten wählen Sie finden die id? *
User.Java
....
import org.hibernate.annotations.DynamicUpdate;
@Entity
@Table(name = "user")
@DynamicUpdate
public class User implements Serializable {
private int ID;
private Name name;
private String type;
public User() {
}
@Id
@GeneratedValue
@Column(name = "id")
public int getID() {
return ID;
}
public void setID(int ID) {
this.ID = ID;
}
@ManyToOne(cascade = CascadeType.ALL)
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
.....
Name.Java
@Entity()
@Table(name = "Name")
public class Name implements Serializable {
private int id;
private String des;
private String index;
private String age;
public Name() {
}
@Id
@GeneratedValue
@Column(name="id", unique= true, nullable = false)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
.....
Model.java
public void addMyUsers(){
Name name = new Name();
name.setDes("MyName");
While( ..... )
{
User user = new User();
user.setName(name);
user.setType(X);
addUser(user);
}
}
public void addUser(User user) {
session = Util.getSession();
session.beginTransaction();
session.merge(user);
//session.saveOrUpdate(user);
session.getTransaction().commit();
session.close();
}
vielen Dank ich habe gelesen, dass, bevor nicht eine Lösung nur erwähnt, dass diese tags sind veraltet.
Auf 4.2.1, es funktioniert, aktualisieren Sie auf neueste, wenn möglich.
das ist also tatsächlich eine doppelte.
die Antwort, die Frage ist falsch, da diese tags sind nicht veraltet. Denn niemand ist in der Lage, um anzuzeigen, dass die Frage, die ich öffne eine neue Frage
InformationsquelleAutor | 2013-06-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ganz richtig ist das nicht. Es ist nicht nur hibernate automatisch zu entscheiden, um einen neuen Benutzer anzulegen. Hibernate ist zu tun, was dein code sagt es:
addMyUsers()
erstellen Sienew Name()
undnew User()
, und Sie geben weder eine bereits bestehende ID. Sie haben diese Objekte sehen aus wie neue, die eher als pre-bestehende aktualisiert werden.addMyUser()
rufen Siesession.merge(user)
. Hibernate sieht die Objekte keine ID haben - und so führt diese zusammen und ordnet Sie den NEUEN status. Wenn die Transaktion spülte & verpflichtet sich, hibernate generiert die SQL zum erstellen neuer IDs und speichern Sie die Objekte als neue Datensätze.Wenn Sie möchten, um zu bestimmen, ob ein Objekt bereits, und betreiben auf den vorherigen Datensatz, wo möglich:
session.find()
odersession.get()
, in Ihrem Fall mit der "det" - Feld.session.clear()
). Neu erstellte Objekte befinden sich bereits in einem abgenommenen Zustand.session.merge()
. Merge funktioniert sowohl für bereits bestehende freistehende Objekte (die über das retrieval und die neue freistehende Objekte (übernew <Object>()
). Alternativ, für bereits bestehende freistehende Objekte, die Sie aufrufen könnensession.update()
und für neue freistehende Objekte, die Sie aufrufen könnensession.save()/persist()
.Sie fehlt (2).
NP. Ich antwortete Ihr Fett Teil. Sie nicht bekommen kann eine ID aus "dünner Luft". Sie müssen es abrufen (Schritt 2).
Vielen Dank für Ihre Antwort, aber ich habe ein anderes problem bei der stackoverflow.com/questions/17396586/...
InformationsquelleAutor Glen Best
Primärschlüssel, spielt eine wichtige Rolle. sollten Sie " name verwenden als Primärschlüssel in diesem Fall, aber ich schlage nicht das Sie das tun, nehmen Sie id als Primärschlüssel.
Update:
Auch im Falle der update-id, die sollte gleich sein mit dem Datensatz, den Sie aktualisieren möchten, aber im Falle von insertion-id muss null sein, und Sie werden es bekommen, eingelegt in db.
Antwort auf Eure Kommentare :
müssen Sie Holen die primäre Taste und verfolgen Sie es auf diese Weise:
InformationsquelleAutor Navdeep Singh
müssen Sie Holen Sie sich die Namen ersten, nicht new Name().
so verwenden Sie das Menü wie "Suche Benutzer" - /dropdown-oder etwas, das der Benutzer wählen kann, die Namen Sie wollen, dann können Sie hinzufügen, dass Namen zu neuen Benutzer.name
oder, wenn Sie nicht wollen, um die Suche für die Namen(von der dünnen Luft, die#lol), sollten Sie nicht verwenden Benutzer.name mit der Art der Namen in den ersten Platz, verwenden Sie string dann. aber es ist mehr als riskant. und die Beziehung werden kann bauen(müssen Sie die Abfrage erneut aus, wenn Sie möchten, zu bekommen, Namen aus der Benutzer, die Namen x).
InformationsquelleAutor Angga
Haben Sie auf diese Weise konfiguriert. Bitte teilen Sie der ur-code, wenn Ihr nicht auf diese Weise.
kann u Aktie den code pls
Frage ist aktualisiert
InformationsquelleAutor Meiyappan Kannappa