2009-08-07 6 views
0

ici je suis encore dans mon auto-apprentissage hibernate et projet d'expérience personnelle pour acquérir plus de compréhension. Voici la description de mon environnement: J'ai une super entité de modèle dont tout mon modèle hérite from.it a seulement la propriété id J'utilise le modèle genericDAO trouvé sur le site web d'hibernation. Maintenant, mon problème est que j'utilise la liste au lieu de définir pour mon mappage un à plusieurs (il n'est pas nécessaire d'éviter la duplication ici) et quand je référence l'ID super-entité dans l'index de liste ou la propriété list-index org.hibernate.NonUniqueObjectException: un autre objet avec la même valeur d'identifiant a déjà été associé à la session ici est l'interface super entitécartographie de la collection hibernate avec la liste et la classe de super entité

public interface Model extends Serializable { 
public Long getId(); 
public void setId(Long id); 
} 

//here is its implementation.they are not in the same physical file 
public abstract class ModelImpl implements Model { 
private Long id; 
public Long getId() { 
    return id; 
} 
public void setId(Long id) { 
    this.id = id; 
} 

}

ici est son fichier de mappage

<class abstract="true" name="ModelImpl"> 
<!--i removed doctype and stuffs--> 
<id name="id"> 
    <generator class="assigned"/> 
</id> 
</class> 

ici est sur l'interface POJO c'est mon parent

public interface Message extends Model { 
Date getDateSent(); 
String getGlobalStatus(); 

} // sa mise en œuvre est ici, mais sur différents fichier physique MessageImpl public class étend ModelImpl implémente un message {private String globalStatus; private Réponses listées = new ArrayList(); privé Date dateSent; // setters et getters .... }

son fichier de mappage est comme ceci:

<union-subclass extends="ModelImpl" name="MessageImpl"> 
<property name="globalStatus"/> 
<property name="dateSent" type="timestamp"/> 

</set> ->

J'ai commenté l'ensemble parce qu'il a été donné une erreur de casting qui me fait réaliser mon e rror de sorte que la classe Response qui est le parent est ici:

public interface Response extends Model { 
String getGatewayMessageId(); 
Message getMessageId(); 
} 
//its implementation but in different physical file 
public class ResponseImpl extends ModelImpl implements Response{ 

private static final long serialVersionUID = 1L; 

private Message messageId; 
private String gatewayMessageId; 
//setters and getters.. 
} 

de sorte que est essentiellement that.now lors de mon test lorsque je tente de sauver un message avec ses enfants, il jette ceci:

org .hibernate.NonUniqueObjectException: un autre objet avec la même valeur d'identifiant a déjà été associé à la session

je peux faire toutes les méthodes PERSISTANTS exception celui que je viens de parler. Je suis un peu perdu ici parce que tous héritent ID du modèle alors qu'est-ce que je fais mal? merci pour la lecture. Je ne comprends pas vraiment le problème ici.

+0

essayez-vous d'enregistrer une entité avec un identifiant déjà utilisé par une autre entité? –

Répondre

0

résoudre it.i ont un gestionnaire (qui crée POJO et OTI) qui injectent de nouveaux Id à chaque nouveau créer POJO.and lors du test i ajouter l'ID manually.thanks pour votre aide

0

On dirait que vous essayez de sauvegarder une entité avec un ID qui existe déjà. Vous vous rendez compte que lorsque vous utilisez l'approche union-subclass, toutes les sous-classes que vous avez peuvent partager le même espace d'identification, n'est-ce pas? Acheter le chemin, avez-vous une raison d'attribuer manuellement des ID, ou les ID générés aideraient-ils?

+0

oui il fait effectivement.il une exigence de ce que je suis en train de faire.vous m'a fait découvrir qu'il est important de donner le même id à différents objets pojo.Maintenant, mon test fonctionne bien individuellement. Mais lors de la construction échoue pour le findbyexample méthode de la ResponseDAOImpl (comme je l'ai dit s'exécute bien lorsque vous exécutez la classe ResponseDAOImplTest seul) .la raison étant: org.hibernate.PropertyAccessException: IllegalArgumentException s'est produite lors de l'appel setter de model.ResponseImpl.messageId. Je dois admettre que je suis un peu perdu –

+0

Cela signifie simplement que votre méthode Setter a jeté une exception IllegalArgumentException. Vous devriez être capable de voir pourquoi dans votre propre code là-bas. – Henning

Questions connexes