2016-06-07 3 views
-2

Как создать сопоставление Hibernate для следующего сценария. У меня есть три стола, Users, Systems и System Assign. Существует три типа пользователей: обычный пользователь, суперпользователь и администратор.Как создать сопоставление Hibernate для следующего сценария

Users Таблица содержит пять столбцов - идентификатор пользователя, имя пользователя, пароль, идентификатор электронной почты и пользовательский тип. userType будет определять, является ли пользователь суперпользователем или администратором или обычным пользователем.

Systems таблица есть столбец, но наиболее важным является systemsID, который будет использоваться для сопоставления.

Я создал одну таблицу System Assign, чтобы назначить систему пользователю с двумя идентификаторами пользователя и системным_имя (или при необходимости можно исправить). Также создаются эти два в качестве внешнего ключа соответствующей таблицы.

Условия отображения являются:

  1. пользователь может иметь один или более системный идентификатор на его имя.
  2. идентификатор системы может быть назначен одному или нескольким пользователям.
  3. , когда запись system_assign удаляется из пользовательского интерфейса, она должна разорвать связь между пользователем и системой, но пользователь и система должны находиться в базе данных.

Также я должен внести некоторые изменения в базе данных, как это:

  • Если супер пользователь создает пользователь, этот пользователь будет находиться под ним
  • если супер пользователь создает систему, система будет быть под ним.
  • Если пользователь удален, тогда система должна находиться под суперпользователем.

Мне нужно знать, как создать классы Hibernate для этого Senario

@Entity 
@Table(name = "SYSTEM_ASSIGN") 
public class SAssign implements Serializable { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = -1945028654484806943L; 
    @Id 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "USERSSO") 
    private Users user; 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "SYSTEMID") 
    private Systems system; 
    public Users getUser() { 
     return user; 
    } 
    public void setUser(Users user) { 
     this.user = user; 
    } 
    public Systems getSystem() { 
     return system; 
    } 
    public void setSystem(Systems system) { 
     this.system = system; 
    } 
} 
+0

можно использовать на спящем стороне. но как управлять на стороне базы данных для этой ситуации. Я могу сделать все необходимые изменения кода, просто хочу запустить это приложение. – shrish

+0

Я пробовал создать класс для system_assign, давая однотавровое отображение, но получая ошибку при сохранении объекта как ORA-01722: недопустимый номер. Я также поделюсь своим классом – shrish

+0

Я вставил класс – shrish

ответ

1

я использую список Role вместо userType и @ManyToMany ассоциации для пользователей и ролей. Объединенные таблицы для ассоциации @ManyToMany будут созданы Hibernate. Вам не нужно использовать для этого постоянные классы.

Классы с отображением: usersystem

тест для отображения: UserSystemTest.java

public enum RoleEnum { 

    ADMIN, USER, SUPER_USER 

} 

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

    @Id 
    @GeneratedValue 
    @Column(name = "f_pid") 
    private Long pid; 

    @Column(name = "f_role") 
    @Enumerated(EnumType.STRING) 
    private RoleEnum role; 

} 

@Entity 
@Table(name = "systems") 
public class SomeSystem { 

    @Id 
    @GeneratedValue 
    @Column(name = "f_pid") 
    private Long pid; 

    @Column(name = "f_name") 
    private String name; 

} 

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

    @Id 
    @GeneratedValue 
    @Column(name = "f_pid") 
    private Long pid; 

    @Column(name = "f_user_name") 
    private String userName; 

    @ManyToMany(fetch = FetchType.LAZY) 
    @JoinTable(name = "user_roles", joinColumns = { @JoinColumn(name = "fk_user") }, 
      inverseJoinColumns = { @JoinColumn(name = "fk_role") }) 
    private List<Role> roles = new ArrayList<Role>(); 

    @ManyToMany(fetch = FetchType.LAZY) 
    @JoinTable(name = "system_assign", joinColumns = { @JoinColumn(name = "fk_user") }, 
      inverseJoinColumns = { @JoinColumn(name = "fk_system") }) 
    private List<SomeSystem> systems = new ArrayList<SomeSystem>(); 

} 
+0

Спасибо большое :) Я буду анализировать и делать то же самое в моем приложении – shrish

+0

@shrish Добро пожаловать. Возможно, вам придется переработать его, потому что это всего лишь шаблон. –