2012-04-22 20 views
7

पर कई लोगों को बरकरार रखता है मेरे पास एक सुंदर मानक परिदृश्य है जिसके द्वारा मेरे पास उपयोगकर्ता_आईडी के साथ उपयोगकर्ता की तालिका है और पीके के रूप में role_id के साथ भूमिकाओं की एक तालिका है। दो टेबल कई रिश्तों से संबंधित हैं (यानी उपयोगकर्ताओं के पास कई भूमिकाएं हो सकती हैं और कई उपयोगकर्ताओं को एक भूमिका लागू की जा सकती है) और बाद में मेरे पास user_has_roles नामक एक जॉइनिंग टेबल है। Users_has_roles में केवल दो कॉलम user_user_id और roles_role_id हैं।जेपीए कई

मैं (देखें नीचे) और मैं उन भूमिकाओं और तालिकाओं के लिए डेटा बने कोई समस्या नहीं है लेकिन मैं एक भूमिका सौंपी जा रही हैं users_has_roles तालिका मेरी उन में से कोई भी शामिल होने ताकि वर्तमान में करने के लिए कुछ भी जारी रहती है बुरी तरह नाकाम रहे हैं इकाई वर्गों जेनरेट किया है । इससे पहले कि मैं पागल हो जाऊं, किसी ने मुझे अपने दुख से बाहर कर दिया और मुझे दिखाया कि मुझे user_has_roles तालिका में संबंधित roles_role_id के साथ user_user_id जोड़ने के बारे में कैसे जाना चाहिए ताकि मेरे उपयोगकर्ताओं की भूमिका हो सके?

मेरे Users.java इकाई वर्ग:

@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.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 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 60) 
@Column(name = "user_id") 
private String userId; 
@Basic(optional = false) 
@NotNull 
@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") 
@Size(min = 1, max = 45) 
@Column(name = "username") 
private String username; 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 120) 
@Column(name = "password") 
private String password; 
@JoinTable(name = "users_has_roles", joinColumns = { 
    @JoinColumn(name = "users_user_id", referencedColumnName = "user_id")}, inverseJoinColumns = { 
    @JoinColumn(name = "roles_role_id", referencedColumnName = "role_id")}) 
@ManyToMany 
private Collection<Roles> rolesCollection; 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "usersUserId") 
private Collection<UserAccount> userAccountCollection; 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "usersUserId") 
private Collection<UserDetails> userDetailsCollection; 

... 

All the getter and setter methods etc. 

मेरे Roles.java इकाई वर्ग:

@Entity 
@Table(name = "roles") 
@XmlRootElement 
@NamedQueries({ 
@NamedQuery(name = "Roles.findAll", query = "SELECT r FROM Roles r"), 
@NamedQuery(name = "Roles.findByRoleId", query = "SELECT r FROM Roles r WHERE r.roleId = :roleId"), 
@NamedQuery(name = "Roles.findByRoleName", query = "SELECT r FROM Roles r WHERE r.roleName = :roleName"), 
@NamedQuery(name = "Roles.findByRolePermission", query = "SELECT r FROM Roles r WHERE r.rolePermission = :rolePermission"), 
@NamedQuery(name = "Roles.findByRoleDescription", query = "SELECT r FROM Roles r WHERE r.roleDescription = :roleDescription")}) 
public class Roles implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 60) 
@Column(name = "role_id") 
private String roleId; 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 45) 
@Column(name = "role_name") 
private String roleName; 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 45) 
@Column(name = "role_permission") 
private String rolePermission; 
@Size(max = 45) 
@Column(name = "role_description") 
private String roleDescription; 
@ManyToMany(mappedBy = "rolesCollection") 
private Collection<Users> usersCollection; 

... 

All the getter and setter methods etc. 

धन्यवाद

---- अद्यतन ----

// New Users 
Users currentUser = new Users(); 
currentUser.setUserId(userId); 
currentUser.setUsername(email); 
currentUser.setPassword(password); 
getUsersFacade().create(currentUser); 

उत्तर

6

आपका उदाहरण ठीक काम करता है (ग्रहण लिंक 2.3, MySQL)। संभवतः उस कोड के हिस्से में समस्या है जो आप नहीं दिखाते हैं। उदाहरण के लिए भूमिकाओं में तत्व जोड़ने में चयन। विशिष्ट गलती उदाहरण के लिए केवल गैर-स्वामित्व वाले पक्ष में तत्व जोड़ने के लिए है।

इसे जारी रखने के लिए आपको डेटाबेस के साथ संगत मेमोरी ऑब्जेक्ट ग्राफ़ को रखने के लिए, पक्ष के पक्ष में एक (मैप किए बिना एक) में संबंधों की देखभाल करना होगा, आपको हमेशा संबंध के दोनों तरफ संशोधित करना चाहिए।

मैं निम्नलिखित के साथ इसे करने की कोशिश:

// method to add element to rolesCollection 
    public void addRoles(Roles r) { 
     rolesCollection.add(r); 
    } 

    //first created new instances of Users and Roles 
    // then: 
    tx.begin(); 
    users.addRoles(r); 
    //it is not needed for persisting, but here you can also 
    //add user to roles. 
    em.persist(users); 
    em.persist(r); 
    tx.commit(); 
+1

हाय मिक्को, मैं कर रहा हूँ अभी भी उलझन में! मुझे समझ में नहीं आता कि उपर्युक्त कोड कैसे काम करता है।अगर मुझे संबंध के दोनों किनारों को संशोधित करने की आवश्यकता है तो क्या मुझे भूमिकाओं और उपयोगकर्ताओं के चयन में तत्व जोड़ने की आवश्यकता है? ऐसा लगता है कि आप केवल भूमिकाओं को जोड़ रहे हैं। इसके अलावा मैं उलझन में हूं जो मैं संबंधित संग्रह में जोड़ रहा हूं। क्या भूमिकाओं को चयन करने के लिए user_user_id और roles_role_id दोनों की आवश्यकता होती है? – tarka

+0

बात यह है कि: डेटाबेस को बनाए रखने के लिए, न्यूनतम आवश्यकताओं को स्वयं पक्ष को संशोधित करना है (मैप किए बिना एक)। खराब बिंदु यह है कि मैप किए गए संग्रह के साथ संग्रह सिंक से बाहर है। यही कारण है कि दोनों पक्षों को संशोधित करना सामान्य रूप से बेहतर होता है, जिसका मतलब है कि दोनों भूमिकाओं में तत्व जोड़ना चयन और भूमिकाएं चयन। –

+0

ठीक है तो सर्वोत्तम संग्रह दोनों संग्रहों में तत्व जोड़ना है ... लेकिन मैं प्रत्येक संग्रह में क्या जोड़ूं? क्या मैं दोनों को user_id और role_id दोनों जोड़ता हूं? – tarka

8

मुझे जवाब देने के लिए अग्रणी के लिए मिक्को करने के लिए धन्यवाद बंद ठीक पहले। मैं सिर्फ एक ऐसा उत्तर पोस्ट करना चाहता था जो किसी और के लिए सीधे सहायक हो सकता है जो कि उस स्थिति में हो सकता है। यह भी यूरेका पल पर आधारित है, इसलिए यह तकनीकी रूप से सही नहीं हो सकता है, लेकिन मैं इसे देखता हूं।

मेरे द्वारा सामना किया जाने वाला बड़ा मुद्दा यह था कि MySQL में मैं ब्रिजिंग टेबल को एक व्यक्तिगत तालिका के रूप में देख सकता था! (खेद है कि मैं अपने ईईआर आरेख की एक छवि पोस्ट नहीं कर सकता लेकिन मुझे इस समय पर्याप्त विशेषाधिकार नहीं दिखते हैं) तो मुझे लगता है कि जावा एक टेबल के रूप में ब्रिजिंग टेबल भी देखेगा! अच्छा यह नहीं है। वह ब्रिजिंग टेबल जावा में वास्तव में एक पारंपरिक तालिका के रूप में मौजूद नहीं है, यह वास्तव में विरोध करने वाले टेबल संग्रह प्रकार द्वारा दर्शाया गया है जिसे आप इसके साथ जोड़ते हैं।

मेरे लिए इसे देखने का सबसे आसान तरीका ब्रिजिंग टेबल को पूरी तरह से भूलना और दो 'असली' टेबलों पर ध्यान देना और उन लोगों को डेटा जोड़ना था। निम्न कोड सबसे अच्छा अभ्यास नहीं है क्योंकि मैं बस role_id को सेट कर रहा हूं लेकिन यह सिर्फ मेरे बिंदु को दिखाने के लिए ठीक है।

List<Roles> userRoleList = new ArrayList<Roles>(); 

Users currentUser = new Users(); 
currentUser.setUserId(userId); 
currentUser.setUsername(email); 
currentUser.setPassword(password); 

Roles userRole = new Roles(); 
userRole.setRoleId("2"); 

userRoleList.add(userRole); 
currentUser.setRolesCollection(userRoleList); 

getUsersFacade().create(currentUser); 

आशा है कि किसी और की मदद करता है जो कई रिश्तों के साथ संघर्ष कर रहा है।

(नायब। मैं मूल प्रश्न कोड आसानी के लिए एक संग्रह के बजाय एक सूची का उपयोग करने के संपादित कर लिया है, लेकिन आप बस के रूप में अच्छी तरह से किसी भी अन्य प्रकार आपकी आवश्यकताएं पूरी कर सकते हैं।)

संबंधित मुद्दे