Come evitare la creazione di una nuova riga se simili riga esiste?

Ho bisogno di configurare sospensione per evitare la creazione di righe duplicate, (anche se la riga esiste si crea uno nuovo, dato che solo uno depositata è impostato impostato tutto il resto NULL)

Permette di dire che ho una riga come la seguente

id des    index age
1  MyName 2     23

Anche se ho appena impostato MyName as des e già esiste nella tabella di Nome sospensione
creare una nuova riga come la seguente

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

Quando ho voglia di sa
.
Così ho aggiunto la seguente annotazione per la mia classe, ma ha attraversato l’Entità, e dynamicUpdate.

@org.hibernate.annotations.Entity(
  dynamicUpdate = true
)

Ho usato @DynamicUpdate, anche se di sospensione accettare ma ancora ho lo stesso problema.

C’è qualche altro metodo per farlo ? La versione della mia sospensione è la seguente

<dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>4.2.1.Final</version>
      <type>jar</type>
</dependency>

*Basato su Ray commento soffiava, assegnando un valore di Id di classe di bambini funziona correttamente, ma se non ho l’ID? devo fare una select per trovare l’id di prima ? C’è qualche metodo per forza di sospensione per farlo automaticamente r in base ai valori di classe di bambini rahter di fare una selezione separata per trovare l’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();
}
  • Vedere stackoverflow.com/q/8935975/1700321.
  • grazie ho letto che prima di non dare una soluzione appena detto che questi tag sono obsolete.
  • Forse avete bisogno di leggere la risposta a questa domanda.
  • Su 4.2.1 funziona, aggiorna all’ultima, se possibile.
  • quindi questo è un duplicato.
  • la risposta a questa domanda è sbagliata, in quanto questi tag non sono deprecate. Come nessuno è in grado di visualizzare la questione che sto aprendo una nuova domanda
  • Ho aggiornato al 4.2.1 ma ancora non aggiorna la riga precedente
  • Sembra che non si capisce cosa @DynamicUpdate fa. Vedi questo post: chekkal.blogspot.com/2012/09/hibernate-dynamic-updates.html.
  • Suppongo che ho scelto un titolo sbagliato, ho aggiornato la domanda, inoltre, fornito un esempio
  • Grazie Jack Ramzi
  • Utilizzare saveOrUpdate metodo e leggere la documentazione per la prossima volta.
  • Ho letto la documentazione già, e utilizzato unione e saveorupdate così, ma ancora lo stesso problema.
  • vedere questo : stackoverflow.com/questions/17296007/…
  • grazie rey significa che si dovrebbe impostare l’id e unire e saveorUpdate non farlo in automatico ?

InformationsquelleAutor | 2013-06-13

 

4 Replies
  1. 7

    anche se la riga esiste si crea una nuova

    Che non è così. Non è solo ibernazione automaticamente di decidere di creare un nuovo utente. Sospensione e cosa fa il tuo codice indica l’:

    • In addMyUsers(), si crea new Name() e new User(), e si dà nessuna di queste pre-esistenti (ID. Hai fatto di questi oggetti sembrano nuove, piuttosto che pre-esistenti per essere aggiornati.
    • In addMyUser(), si chiama session.merge(user). Sospensione vede gli oggetti non hanno ID in modo che li unisce e li assegna il NUOVO stato. Quando la transazione viene svuotata & commessi, genera hibernate SQL per creare un nuovo Id e memorizzare gli oggetti come nuovi record.

    Se si desidera determinare se un oggetto è pre-esistente, e di operare sul record precedente, ove possibile:

    1. Ottenere i campi che si desidera utilizzare (ad esempio da un modulo web) – nel tuo caso, si tratta di “det” campo.
    2. Vedere se il record esiste già nel database. Recuperare l’oggetto, utilizzando hibernate via session.find() o session.get(), nel tuo caso, usando il “det” campo.
    3. Se l’oggetto non può essere trovato, poi creare un nuovo oggetto.
    4. Per oggetti recuperati, facoltativamente, è possibile scollegare l’oggetto della sessione prima di ogni modifica, (ad esempio via session.clear()). Gli oggetti appena creati sono già in una posizione distaccata.
    5. Modificare l’oggetto (set di campi).
    6. Se l’oggetto è indipendente, quindi collegare via session.merge(). Merge funziona sia pre-esistente indipendente oggetti (ottenuto tramite il recupero) e nuovi oggetti scollegati (via new <Object>()). In alternativa, per il pre-esistenti, staccato di oggetti è possibile chiamare session.update() e per il nuovo padiglione oggetti che si possono chiamare session.save()/persist().
    7. a filo/commit della transazione.

    Ti manca (2).

    • La domanda è aggiornato, si prega di leggere la parte in grassetto, grazie
    • NP. Ho risposto alla tua parte in grassetto. Non è possibile ottenere un ID di “aria sottile”. È necessario recuperare (passo 2).
    • Grazie per la tua risposta, ma ho un altro problema stackoverflow.com/questions/17396586/…
  2. 4

    Chiave primaria, che gioca un ruolo importante qui. si dovrebbe usare il nome della chiave primaria in questo caso, ma io non suggerisco di farlo, prendere l’id come chiave primaria.

    Aggiornamento:

    Anche in caso di aggiornare l’id dovrebbe essere la stessa, con il record che si desidera aggiornare, ma in caso di inserimento, id deve essere null e si otterrà inserito nel db.

    Rispondere ai vostri commenti :

    occorre recuperare la chiave primaria e tenere traccia di esso in questo modo:

       session.update(recordEntity);//or save 
       int id=recordEntity.getId();
  3. 2

    è necessario ottenere il Nome prima, non nuovo Nome().

    quindi utilizzare il menu come “cerca utente”/discesa o qualcosa per l’utente di scegliere il Nome si desidera, allora si può aggiungere che Nome per nuovo Utente.nome

    o se non si desidera effettuare la ricerca per Nome(dall’aria rarefatta#lol), non si dovrebbe usare Utente.nome con il tipo di Nome in primo luogo, utilizzare stringa poi. ma è più rischioso. e il rapporto non può essere costruire in quel modo(è necessario eseguire nuovamente la query se si desidera ottenere Nome dal Utente che hanno nome di x).

  4. 0

    Hai configurato in questo modo. Si prega di condividere ur codice, se non in questo modo.

    @Entity
    @Table(name = "example", catalog = "example_catalog")
    @org.hibernate.annotations.Entity(
            dynamicUpdate = true
    )
    • Come ho detto nella domanda non funziona
    • u può condividere il codice pls
    • la domanda è aggiornato

Lascia un commento