JPA plusieurs-à-plusieurs persistent à table de jointure
J'ai deux table avec plusieurs-à-plusieurs relations. Je l'ai associé ces deux entités lorsque je suis persistance des utilisateurs n'a pas d'insérer quoi que ce soit à la table de jointure. Je suis de débogage jusqu'à la persiste, je vois des groupes de la liste n'est pas null.
Ther est pas de message d'erreur juste persister utilisateur.
utilisateurs <--> user-group <--> groupes
Je suis à l'aide de netbeans 7.3, Glassfish 3.1.2.2, postgresql 9.1 et eclipselink 2
Aussi, j'ai essayé de montrer scripts sql propriétés ci-dessous ne fonctionne pas pour moi.
<property name="eclipselink.logging.logger" value="ServerLogger"/>
<property name="eclipselink.logging.level" value="FINE"/>
<property name="eclipselink.logging.level.sql" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
Abstraite DAO:
public abstract class GenericDAO<E> implements Serializable{
@PersistenceContext
EntityManager entityManager;
public void persist(E object){
entityManager.persist(object);
}
public void merge(E object){
entityManager.merge(object);
}
public void delete(E object){
object = entityManager.merge(object);
entityManager.remove(object);
}
}
Les Utilisateurs De L'Entité :
@Entity
@Table(name = "users")
@XmlRootElement
@NamedQueries(
{
@NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
@NamedQuery(name = "Users.findByUserId", query = "SELECT u FROM Users u WHERE u.userId = :userId"),
@NamedQuery(name = "Users.findByName", query = "SELECT u FROM Users u WHERE u.name = :name"),
@NamedQuery(name = "Users.findBySurname", query = "SELECT u FROM Users u WHERE u.surname = :surname"),
@NamedQuery(name = "Users.findByEmail", query = "SELECT u FROM Users u WHERE u.email = :email"),
@NamedQuery(name = "Users.findByUsername", query = "SELECT u FROM Users u WHERE u.username = :username"),
@NamedQuery(name = "Users.findByPassword", query = "SELECT u FROM Users u WHERE u.password = :password")
})
public class Users implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "user_id")
private Integer userId;
@Size(max = 2147483647)
@Column(name = "name")
private String name;
@Size(max = 2147483647)
@Column(name = "surname")
private String surname;
//@Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation
@Size(max = 2147483647)
@Column(name = "email")
private String email;
@Size(max = 2147483647)
@Column(name = "username")
private String username;
@Size(max = 2147483647)
@Column(name = "password")
private String password;
@ManyToMany(mappedBy = "usersList")
private List<Groups> groupsList;
@OneToMany(mappedBy = "userId")
private List<Person> personList;
//Getters Setters
Groupes Entité :
@Entity
@Table(name = "groups")
@XmlRootElement
@NamedQueries(
{
@NamedQuery(name = "Groups.findAll", query = "SELECT g FROM Groups g"),
@NamedQuery(name = "Groups.findByGroupId", query = "SELECT g FROM Groups g WHERE g.groupId = :groupId"),
@NamedQuery(name = "Groups.findByGroupName", query = "SELECT g FROM Groups g WHERE g.groupName = :groupName"),
@NamedQuery(name = "Groups.findByGroupDescription", query = "SELECT g FROM Groups g WHERE g.groupDescription = :groupDescription")
})
public class Groups implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "group_id")
private Integer groupId;
@Size(max = 2147483647)
@Column(name = "group_name")
private String groupName;
@Size(max = 2147483647)
@Column(name = "group_description")
private String groupDescription;
@JoinTable(name = "user_group", joinColumns =
{
@JoinColumn(name = "group_id", referencedColumnName = "group_id")
}, inverseJoinColumns =
{
@JoinColumn(name = "user_id", referencedColumnName = "user_id")
})
@ManyToMany(fetch = FetchType.EAGER)
private List<Users> usersList;
//Getters Setters
Utilisateur DAO :
public class UserDAO extends GenericDAO<Users> implements Serializable {
public List<Users> getAllUsers()
{
Query query = entityManager.createNamedQuery("Users.findAll");
List<Users> users = query.getResultList();
return users;
}
}
OriginalL'auteur erdoganonur | 2013-10-19
Vous devez vous connecter pour publier un commentaire.
Vous devez activer
cascade
de fusion (à l'aide dePERSIST
) ou toutes les opérations avecALL
.La manière d'une cartographie de la table de jointure fonctionne, c'est que
user_group
aurait un clé étrangère contrainte suruser
etgroup
table. C'est pourquoi une nouvelle ligne dansgroup
doit être insérée pour son clé primaire être utilisé pour ajouter une nouvelle ligne àuser_group
.Cela n'a rien à voir avec JPA, et il en serait de même pour vous, même si vous avez été à l'aide de la plaine JDBC à la place. C'est de cette façon Entité-Relations de travail dans la base de données.
Ce comportement est contrôlé par le
eclipselink.ddl-generation
de la propriété spécifiée pour votrepersistence-unit
. Lorsqu'il est spécifié quedrop-and-create-tables
, EclipseLink recrée l'ensemble du schéma de base de données (suppression de toutes les données existantes dans le processus).Ceci, cependant, est activé juste pour faciliter votre développement. Ce n'est pas censé être utilisé dans des environnements de production où son désactivé par pas l'indication de cette propriété ou en fixant sa valeur en tant que
none
.C'est très inhabituel.
user_group
aurait une contrainte de clé étrangère dépend degroup
table. C'est pourquoigroup
est inséré et puis sa clé primaire utilisée pour ajouter une nouvelle ligne àuser_group
. Ce ne sera pas possible de faire autrement.'user_group' a fk avec "groupe" et de la table 'user'. Aussi j'ai laissé tomber toutes les tables et ils ont été générés par eclipse lien automatiquement. Ils sont les mêmes mais ne pas insérer une ligne de "user_group'
Veuillez prendre un coup d'oeil à ma mise à jour.
Le "user_group table a clé étrangère avec les "utilisateurs" et "groupes". Je comprends jpa du comportement lors de la cascade de la stratégie est de persister. Mais je ne peux pas gérer cela. Vous pouvez le vérifier mon projet git : github.com/erdoganonur/MkmTurizm.Thanks pour votre aide.
OriginalL'auteur Ravi Thapliyal
Pour votre première question sur le point de montrer des scripts sql, j'ai ajouté ce code dans les persistence.xml
Après que, propre et de créer et déployer. Le sql exécuté par JPA sera affiché dans la glassfish domaine journal de l'edi netbeans.
Pour votre deuxième question sur le plusieurs-à-plusieurs relations.
j'ai eu le même problème dans le même scénario, car j'ai à mettre en œuvre la sécurité sur le web et j'ai besoin de la même relation que vous utilisez. De toute façon, j'ai compris que le problème n'était pas dans les entités.
Vous avez à vérifier (pour mon cas) de l'insert et méthodes de modification sur le UserJPAController.java de telles méthodes certains comment sait la façon dont les entités sont référencés les uns des autres, donc j'ai mis en place ce code et il fonctionne très bien.
Après l'exécution de ce code et l'opération est terminée, vous verrez les scripts sql exécutées par JPA dans la Base de Données.
Espère que cela aide!
Mike
OriginalL'auteur viejodecaldas