2017-09-24 76 views
2

目前我正在休眠和我有以下PostgreSQL表結構:的Hibernate映射5上的外鍵

CREATE TABLE tbl_secure 
(
    plug_id bigserial NOT NULL, 
    plug_name text DEFAULT ''::text, 
    plug_user text DEFAULT ''::text, 
    CONSTRAINT "PK_PLUG_ID" PRIMARY KEY (plug_id), 
    CONSTRAINT tbl_secure_plug_user_fkey FOREIGN KEY (plug_user) 
     REFERENCES auth_users (username) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE CASCADE 
) 

CREATE TABLE auth_users 
(
    id bigint NOT NULL DEFAULT nextval('users_id_seq'::regclass), 
    username character varying(64) NOT NULL, 
    passwd character varying(64) NOT NULL, 
    pass_expiry date DEFAULT ((now())::date + '1 mon'::interval), 
    CONSTRAINT users_pkey PRIMARY KEY (id), 
    CONSTRAINT auth_users_username_key UNIQUE (username) 
) 

和休眠註明實體:

@Entity 
@Table(name="tbl_secure",schema="public") 
public class TblSecure implements java.io.Serializable { 

    private Long plugId; 
    private AuthUsers authUsers; 
    private String plugName; 

    public TblSecure() { 
    } 

    @Id @GeneratedValue(strategy=IDENTITY) 
    @Column(name="plug_id", unique=true, nullable=false) 
    public Long getPlugId() { 
     return this.plugId; 
    } 

    public void setPlugId(Long plugId) { 
     this.plugId = plugId; 
    } 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="plug_user") 
    public AuthUsers getAuthUsers() { 
     return this.authUsers; 
    } 

    public void setAuthUsers(AuthUsers authUsers) { 
     this.authUsers = authUsers; 
    } 


    @Column(name="plug_name") 
    public String getPlugName() { 
     return this.plugName; 
    } 

    public void setPlugName(String plugName) { 
     this.plugName = plugName; 
    } 
} 

@Entity 
@Table(name="auth_users",schema="public", uniqueConstraints [email protected](columnNames="username")) 

public class AuthUsers implements java.io.Serializable { 
    private Long id; 
    private String username; 
    private String passwd; 
    private Set tblSecures = new HashSet(0); 

    public AuthUsers() { 
    } 

    @Id @GeneratedValue(strategy=IDENTITY) 

    @Column(name="id", unique=true, nullable=false) 
    public Long getId() { 
     return this.id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 


    @Column(name="username", unique=true, nullable=false, length=64) 
    public String getUsername() { 
     return this.username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 


    @Column(name="passwd", nullable=false, length=64) 
    public String getPasswd() { 
     return this.passwd; 
    } 

    public void setPasswd(String passwd) { 
     this.passwd = passwd; 
    } 

    @OneToMany(fetch=FetchType.LAZY, mappedBy="authUsers") 
    public Set<TblSecure> getTblSecures() { 
     return this.tblSecures; 
    } 

    public void setTblSecures(Set<TblSecure> tblSecures) { 
     this.tblSecures = tblSecures; 
    } 
} 

我試圖使用HQL取回:

Query query = session.createQuery("from TblSecure sec WHERE  sec.uathUser.username=:pUser AND sec.plugName=:pName AND  sec.plugSystem=:pSystem"); 

query.setParameter("pUser", "user"); 

query.setParameter("pName", "plugname"); 

query.setParameter("pSystem", "projectname"); 

List<TblSecure> result = query.list(); 

for(TblSecure sec2 : result){ 
/// 
} 

錯誤即時得到的是:

org.postgresql.util.PSQLException: ERROR: operator does not exist: text = bigint

due to this hibernate formatted sql : "tblsecure0_.plug_user=authusers1_.id"

應該比較代替。

希望有人可以幫助我,如果我有一個不正確的關聯映射。

TIA :)

回答

0

您要使用@ManyToOne與關係外鍵,是不是在其他表的主鍵。

在這種情況下,你需要添加額外的信息,以使這項工作:

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="plug_user", referencedColumnName="username") 
public AuthUsers getAuthUsers() { 
    return this.authUsers; 
} 
+0

太感謝你了!有效。 :) – DCE

+0

太棒了。很高興我能幫上忙 –