2009-09-27 8 views
6

मैंने अपने दो इकाई वर्गों उपयोगकर्ता और अनुमति के बीच कई से अधिक संबंधों को परिभाषित किया है। उपयोगकर्ता का उपयोगकर्ता नाम और काउंटीआईडी ​​का प्राथमिक कुंजी समग्र है, और मेरी अनुमति तालिका में नियमित पूर्णांक आईडी है। तालिका UserPermission में तीन विदेशी कुंजी हैं, इसकी प्राथमिक कुंजी: उपयोगकर्ता नाम, काउंटीआईडी ​​और अनुमति आईडी।हाइबरनेट: विदेशी कुंजी में कॉलम की गलत संख्या

चूंकि यह एक विरासत डेटाबेस है, इसलिए मुझे सही चीज (™) करने का अवसर नहीं होगा और उपयोगकर्ता पर एक पूर्णांक प्राथमिक कुंजी बनाने का अवसर नहीं होगा।

मैं User.class में इस तरह कई-से-अनेक संबंध परिभाषित किया है:

@ManyToMany(targetEntity=Permission.class, cascade={ CascadeType.PERSIST, CascadeType.MERGE }) 
@JoinTable(name="tblUserPermission", 
joinColumns = { @JoinColumn(name="username"), @JoinColumn(name="countyId") }, 
inverseJoinColumns = { @JoinColumn(name="permissionId") }) 
private Collection<Permission> permissions; 

Permission.class इस कहते हैं:

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "permissions", targetEntity = User.class) 
private Collection<User> users; 

मुझे लगा कि यह जाने का रास्ता था , लेकिन जब मैं अपने स्प्रिंग संदर्भ हाइबरनेट 3 का उपयोग करता है ऊपर आग, मैं मिलता है:

Caused by: org.hibernate.AnnotationException: A Foreign key refering com.mydomain.data.entities.User from com.mydomain.data.entities.Permission has the wrong number of column. should be 1 

मुझे अपने ANNOT में गलत किया है व्यावहारिक? यह 2 होना चाहिए, 1.


अद्यतन नहीं:

आर्थर मैं referencedColumnName जोड़ने का सुझाव दिया है, लेकिन यह मेरे लिए एक नया अपवाद दिया:

Caused by: org.hibernate.AnnotationException: referencedColumnNames(username, countyId) of com.mydomain.data.entities.Permission.permissions referencing com.mydomain.data.entities.User not mapped to a single property 

उनके अनुरोध पर, यहाँ कोड का पालन करें : Permission.Class:

package com.mydomain.data.entities; 

import java.io.Serializable; 
import java.util.Collection; 
import javax.persistence.*; 
import org.hibernate.annotations.ForeignKey; 

@Entity 
@Table(name = "tblPermission") 
public class Permission extends PublishableEntityImpl implements Serializable, Cloneable { 

    private static final long serialVersionUID = 7155322069731920447L; 

    @Id 
    @Column(name = "PermissionId", length = 8, nullable = false) 
    private String PermissionId = ""; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name = "CountyId", nullable = false) 
    @ForeignKey(name="FK_CountyID") 
    private County county; 

    @Column(name = "Permission", nullable = true) 
    private Integer permission = 1; 

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, 
      mappedBy = "Permissions", 
      targetEntity = Item.class) 
    private Collection<Item> items; 

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, 
      mappedBy = "Permissions", 
      targetEntity = User.class) 
    private Collection<User> users; 

    /** Getters and Setters **/ 
} 

और User.class

package com.mydomain.data.entities; 

import java.util.*; 
import java.io.Serializable; 
import javax.persistence.*; 
import org.hibernate.annotations.ForeignKey; 
import org.hibernate.annotations.IndexColumn; 
import org.springframework.security.core.GrantedAuthority; 
import org.springframework.security.core.authority.GrantedAuthorityImpl; 
import org.springframework.security.core.userdetails.UserDetails; 

@Entity 
@Table(name = "tblUser") 
public class User extends PublishableEntityImpl implements Serializable, Cloneable { 

    @Id 
    @Column(name = "CountyId", nullable = false) 
    private Integer countyId; 

    @Id 
    @Column(name = "Username", length = 25, nullable = false) 
    private String username; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name = "CountyId", nullable = false, insertable=false, updatable=false) 
    @ForeignKey(name="FK_CountyID") 
    private County county; 

    @Column(name = "Name", length = 50, nullable = true) 
    private String name; 

    @Column(name = "Password", length = 30, nullable = true) 
    private String password; 

    @Column(name = "Role", nullable = false) 
    private Integer role; 

    @ManyToMany(targetEntity=Permission.class, 
      cascade={ CascadeType.PERSIST, CascadeType.MERGE }) 
    @JoinTable(name="tblUserPermission", 
      joinColumns = { @JoinColumn(name="Username", referencedColumnName="Username"), @JoinColumn(name="CountyId", referencedColumnName="CountyId") }, 
      inverseJoinColumns = { @JoinColumn(name="PermissionId", referencedColumnName="PermissionId") }) 
    private Collection<Permission> permissions; 

    @OneToMany(fetch=FetchType.LAZY, mappedBy="county") 
    @IndexColumn(name="version") 
    private List<Version> versions; 

    /** Getters and setters **/ 
} 

चीयर्स

Nik

+0

हैलो, मैं बहुत ही समस्या थी, लेकिन अपने उदाहरण का पालन करना, मैं इस त्रुटि हो रही है: संदर्भ एक अज्ञात इकाई: java.lang.String। मेरे मामले में काउंटी स्ट्रिंग प्रकार होगा। –

उत्तर

5

referencedColumnName अपवाद

हल करने के लिए उपयोगकर्ता में आदेश में

@ManyToMany(cascade={CascadeType.PERSIST, cascadeType.MERGE}) 
private Collection<Permission> permissions; 

डाल और अनुमति में

@ManyToMany(mappedBy="permissions") 
@JoinTable(name="tblUserPermission", 
joinColumns={@JoinColumn(name="permissionId", referencedColumnName="permissionId")}, 
inverseJoinColumns={ 
@JoinColumn(name="username", referencedColumnName="username"),       
@JoinColumn(name="countyId", referencedColumnName="countyId")}) 
private Collection<User> users; 

UserId वर्ग

public class UserId implements Serializable { 

    private String username; 

    private Integer countyId; 

    // getter's and setter's 

    public boolean equals(Object o) { 

     if(o == null) 
      return false; 

     if(!(o instanceof UserId)) 
      return false; 

     UserId id = (UserId) o; 
     if(!(getUsername().equals(id.getUsername())) 
      return false; 

     if(!(getCountyId().equals(id.getCountyId())) 
      return false; 

     return true; 
    } 

    public int hachcode() { 
     // hashcode 
    } 

} 

तो उपयोगकर्ता वर्ग में डाल

@Entity 
@Table(name="tblUser") 
@IdClass(UserId.class) 
public class User ... { 

    @Id 
    private String username; 

    @Id 
    private Integer countyId; 

} 

संबंध है,

+0

तो बस स्पष्ट होने के लिए, नाम-तालिका में तालिका कॉलम नाम है जबकि संदर्भित कॉलमनाम इकाई-तालिका में तालिका कॉलम है? वैसे भी, संदर्भित कॉलमनाम मुझे जोड़ना "कारण: org.hibernate.AnnotationException: com.mydomain.data.entities के संदर्भित कॉलमनाम (उपयोगकर्ता नाम, काउंटीआईडी)। Com.mydomain.data.entities का संदर्भ देने वाले पैरामिशन.permissions।प्रयोक्ता को एक ही संपत्ति में मैप नहीं किया गया है "जो मजाकिया becuase 'अनुमतियां वर्ग उपयोगकर्ता से संबंधित है, वर्ग अनुमति – niklassaers

+0

बीटीडब्लू नहीं, आपने targetEntity = Permission.class को क्यों हटाया? – niklassaers

+0

बस एक पल। यदि आप जेनेरिक प्रकार संग्रह घोषित करते हैं और संग्रह targetEntity आवश्यक नहीं है। मैं आपका पहला संदेह देख सकता हूं –

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