Comment éviter de créer une nouvelle ligne si une ligne similaire existe?
J'ai besoin de configurer hibernate pour éviter de créer des doublons de lignes, (bien que la ligne existe, il en crée une nouvelle, et depuis un seul déposée, il est mis tout le reste à NULL)
Permet de dire que j'ai une ligne comme suit
id des index age
1 MyName 2 23
Bien que je viens de mettre en Monnom comme des et il existe déjà dans le Nom de la table hibernate
créer une nouvelle ligne comme suit
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
Quand je veux sa
.
J'ai donc ajouté l'annotation suivante à ma classe, mais la traversée de l'Entité, et dynamicUpdate.
@org.hibernate.annotations.Entity(
dynamicUpdate = true
)
J'ai utilisé @DynamicUpdate
ainsi, bien que hibernate de l'accepter, mais j'ai toujours le même problème.
Est-il une autre méthode pour le faire ? La Version de mon hibernation est comme suivant
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.1.Final</version>
<type>jar</type>
</dependency>
*Basé sur le commentaire de Ray par soufflait, Par l'attribution d'une valeur d'Id de classe enfant qu'il fonctionne correctement, mais que diriez-vous si je n'ai pas la carte d'identité? dois-je faire un select pour trouver l'id d'abord ? Existe t'il une méthode pour forcer hibernate pour le faire automatiquement r basé sur les valeurs de la classe enfant rahter que de faire une sélection distincte pour trouver 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();
}
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas tout à fait droit. Ce n'est pas seulement hibernate automatiquement décider de créer un nouvel utilisateur. Hibernate est de faire ce que votre code dit:
addMyUsers()
vous créeznew Name()
etnew User()
et vous donner aucune de ces pré-ID. Vous avez fait de ces objets ressemblent à de nouveaux, plutôt que de pré-existants pour être mis à jour.addMyUser()
vous appelezsession.merge(user)
. Hibernate voit les objets n'ont aucune ID - de sorte qu'il les fusionne et leur assigne le NOUVEAU statut. Lorsque la transaction est vidé & commis, hibernate génère le SQL pour créer de nouvelles Id et de stocker des objets comme des nouveaux enregistrements.Si vous souhaitez déterminer si un objet est pré-existants, et de fonctionner sur l'enregistrement précédent, si possible:
session.find()
ousession.get()
dans votre cas, à l'aide de la "det" sur le terrain.session.clear()
). Les objets nouvellement créés sont déjà dans un état détaché.session.merge()
. Fusion fonctionne pour les deux pré-existantes des objets détachés (obtenu via la récupération des données) et de nouveaux objets détachés (vianew <Object>()
). Sinon, pour les pré-existantes des objets détachés, vous pouvez appelersession.update()
et pour les nouveaux objets détachés, vous pouvez appelersession.save()/persist()
.Vous êtes absent (2).
Sa clé primaire qui joue un rôle important ici. vous devriez nom de l'utiliser comme clé primaire dans ce cas, mais je ne vais pas vous suggérons de le faire, de prendre l'id comme clé primaire.
Mise à jour:
Également en cas de mise à jour de l'id doit être la même avec le dossier que vous souhaitez mettre à jour, mais dans le cas de l'insertion, l'id doit être null et vous l'aurez inséré dans la db.
Répondre à vos commentaires :
vous besoin de récupérer la clé primaire et la piste de cette façon:
vous devez obtenir le Nom la première, pas nouveau Nom().
donc utiliser le menu comme "rechercher un utilisateur"/liste déroulante ou quelque chose pour l'utilisateur de choisir le Nom qu'ils veulent, alors vous pouvez l'ajouter Nom à nouvel Utilisateur.nom
ou si vous ne voulez pas à la recherche pour le Nom de la première(à partir de l'air mince#lol), vous ne devez pas utiliser de l'Utilisateur.nom avec le type de Nom en premier lieu, l'utilisation chaîne ensuite. mais c'est plus risqué. et la relation peut pas se construire de cette façon(vous devez interroger à nouveau si vous souhaitez obtenir Nom de la Utilisateur que de nom x).
Avez-vous configuré de cette manière. S'il vous plaît partager ur code si ce n'est pas de cette façon.