2013-07-25 4 views
1

Я новичок в Hibernate, поэтому, пожалуйста, простите меня, если вопрос дублируется или глупо. Я использую Hibernate 3.3.0, PostgreSQL DB. Сейчас у меня есть 2 объекта. Мне нужно, чтобы связать их с @OneToMany аннотаций таким образом, что User.roleID был PK и Role.id был FK (пользователь может иметь только одну роль, и та же роль может быть назначена для многих пользователей). Также, когда я искал Google, я узнал, что по каким-то причинам каждый пример с ассоциациями аннотаций имеет аннотированное поле, объявленное как Set. Пожалуйста, объясните это мне. Благодарю вас за консультацию.Сопоставление двух таблиц с аннотациями спящего режима

Nazar.

объект пользователя:

package com.dataart.mediaportal.model; 

import java.io.Serializable; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 


@Entity 
@Table(name = "users") 
public class User implements Serializable { 

    private int id; 
    private String login; 
    private String password; 
    private String firstName; 
    private String lastName; 
    private int roleID; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "user_id", unique = true) 
    public int getId() { 
     return id; 
    } 

    @Column(name = "user_login", nullable=false, unique = true, length = 20) 
    public String getLogin() { 
     return login; 
    } 

    @Column(name = "user_password", nullable = false, length = 32) 
    public String getPassword() { 
     return password; 
    } 

    @Column(name = "user_name", nullable = true) 
    public String getFirstName() { 
     return firstName; 
    } 

    @Column(name = "user_lastname", nullable = true) 
    public String getLastName() { 
     return lastName; 
    } 

    @Column(name = "role_id", nullable = false) 
    public int getRoleID() { 
     return roleID; 
    } 

    public void setRoleID(int roleID) { 
     this.roleID = roleID; 
    } 

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

    public void setLogin(String login) { 
     this.login = login; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public void setFirstName(String firstname) { 
     this.firstName = firstname; 
    } 

    public void setLastName(String lastname) { 
     this.lastName = lastname; 
    } 
} 

Роль предпринимательства:

package com.dataart.mediaportal.model; 

import java.io.Serializable; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Table; 


@Entity 
@Table(name = "roles") 
public class Role implements Serializable { 

    private int id; 
    private String role; 

    @Id 
    @Column(name = "role_id", nullable = false) 
    public int getId() { 
     return id; 
    } 

    @Column(name = "role_name", nullable = false) 
    public String getRole() { 
     return role; 
    } 

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

    public void setRole(String role) { 
     this.role = role; 
    } 

} 

DB Сценарий:

DROP TABLE IF EXISTS users CASCADE; 
DROP TABLE IF EXISTS roles CASCADE; 
DROP TABLE IF EXISTS albums CASCADE; 
DROP TABLE IF EXISTS images CASCADE; 

CREATE TABLE users 
(
    user_login character varying(20) NOT NULL, 
    user_password character varying(32) NOT NULL, 
    user_name character varying, 
    user_lastname character varying, 
    role_id integer DEFAULT 0, 
    user_id serial NOT NULL, 
    CONSTRAINT pk_user_id PRIMARY KEY (user_id), 
    CONSTRAINT users_user_login_key UNIQUE (user_login) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE users 
    OWNER TO postgres; 

CREATE TABLE roles 
(
    role_id integer NOT NULL, 
    role_name character varying NOT NULL DEFAULT 'user'::character varying, 
    CONSTRAINT role_id_pk PRIMARY KEY (role_id) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE roles 
    OWNER TO postgres; 

INSERT INTO roles 
VALUES (0, 'user'), 
(1, 'admin'); 

-- testlog - testpass 
-- user - password 
INSERT INTO users 
VALUES ('testlog', '179ad45c6ce2cb97cf1029e212046e81', 'Nazar', 'Sobchuk', 1), 
('user', '5f4dcc3b5aa765d61d8327deb882cf99', 'unknown', 'unknown', 0); 


CREATE TABLE albums 
(
    album_name character varying NOT NULL, 
    user_id integer, 
    album_id serial NOT NULL, 
    CONSTRAINT album_id PRIMARY KEY (album_id), 
    CONSTRAINT user_id FOREIGN KEY (user_id) 
     REFERENCES users (user_id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE albums 
    OWNER TO postgres; 
CREATE INDEX fki_user_id 
    ON albums 
    USING btree 
    (user_id); 

INSERT INTO albums VALUES ('Main Album', 1); 

CREATE TABLE images 
(
    img bytea, 
    img_name character varying NOT NULL, 
    album_id integer, 
    img_id serial NOT NULL, 
CONSTRAINT images_img_name UNIQUE(img_name), 
    CONSTRAINT album_id FOREIGN KEY (album_id) 
     REFERENCES albums (album_id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 

) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE images 
    OWNER TO postgres; 

CREATE INDEX fki_album_id 
    ON images 
    USING btree 
    (album_id); 

Вставка пользователя:

public boolean insertUser(User user) { 
    factory = getSessionFactory(); 
    session = factory.openSession(); 
    tx = session.beginTransaction(); 
    Query queryResult = session.createQuery("from User"); 
    List<User> userList = queryResult.list(); 
    for (User u : userList) { 
     if (u.getLogin().equalsIgnoreCase(user.getLogin())) { 
      FacesContext.getCurrentInstance().addMessage(null, 
        new FacesMessage("User_is_already_registered")); 
      return false; 
     } 
    } 
    session.save(user); 
    tx.commit(); 
    session.close(); 
    return true; 
} 

ответ

1

Добавьте пользователя как отношение ко многим к роли, как показано ниже. создать сеттер, а

private List<User> userList; 
    @OneToMany(mappedBy = "role") 
    public List<User> getUserList() { 
     return userList; 
    } 

Добавить роли, как многие к одному отношению к Пользователю, как показано ниже

private Role role; 
    @ManyToOne 
    public Role getRole() { 
     return role; 
    } 
+0

Спасибо. Я попробую и дам вам знать, если это сработает. –

+0

Что-то пошло не так, когда я попытался вставить пользователя в таблицу. У меня это PSQLException: ERROR: column user0_.role_role_id не существует. Может, я добавил что-то не так? Я добавил это к Пользователь: @ManyToOne public Role getRole() { return role; } public void setRole (Ролевая роль) { this.role = role; } и его Роль: приватный список userList; @OneToMany (mappedBy = "role") public List getUserList() { return userList; } public void setUserList (Список userList) { this.userList = userList; } –

+1

Можете ли вы опубликовать код, как вы пытаетесь добавить пользователя, установив значения –

Смежные вопросы