hibernate отображенные и неотображенные классы и дизайн mysql

Я планирую разработать новую систему с спящим режимом. Если я создаю классы гибернации с сопоставлением, например

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

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer userid;

    private String username;
    private String password;

    @OneToOne
    private Role userrole;

.....
}

добавить класс роли

@Entity
public class Role {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    private String roleName;
...
}

В этом случае каждый раз, когда я добавляю пользователя в базу данных, мне нужно получить объект роли из базы данных, добавить к объекту пользователя и сохранить его. Если я определяю такое сопоставление с другими сложными классами дизайна, мне нужно получить соответствующие сопоставленные классы из db. Я чувствую, что это дополнительная нагрузка на БД. их любой путь к этому эффективно?

У меня есть другой план, например, без отображения гибернации.

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

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer userid;

    private String username;
    private String password;
    private Integer roleid;
 ....
}

В этом случае я могу просто добавить идентификатор в объект пользователя и сохранить его. Но классы БД не будут сопоставлены. если я сделаю это для всех классов, у меня будут таблицы БД без сопоставления внутри БД, если я сделаю это, чтобы получить имя роли, мне нужно создать другой sql, чтобы получить роль.

Таким образом, в первом подходе при сохранении объекта я получаю объект и сохраняю его, а во втором подходе мы должны создать два sql, чтобы получить два объекта. Это хороший способ реализовать это?

Какая из этих двух установок хороша, эффективна и проста в использовании? Любое обсуждение рекомендуемого способа, пожалуйста?


person Karesh A    schedule 28.09.2013    source источник


Ответы (1)


В этом случае каждый раз, когда я добавляю пользователя в базу данных, мне нужно получить объект роли из базы данных, добавить к объекту пользователя и сохранить его. Если я определяю такое сопоставление с другими сложными классами дизайна, мне нужно получить соответствующие сопоставленные классы из db. Я чувствую, что это дополнительная нагрузка на БД. их любой путь к этому эффективно?

Здесь вы не загрузили объект роли из БД. Вы должны просто создать экземпляр роли и добавить его с помощью пользователя.

  Role r=new Role();
  r.setName("ROLE_NAME");

  user.setRole(r);
  r.setUser(user);
  session.saveOrUpdate(user);
  session.saveOrUpdate(r);

Если вы каскадируете роль с пользователем, вы можете уменьшить повторяющуюся операцию saveOrUpdate().

Какая из этих двух установок хороша, эффективна и проста в использовании? Любое обсуждение рекомендуемого способа, пожалуйста?

Как правило, для аутентификации JDBC роль и пользовательская таблица должны быть разделены и сопоставлены. Итак, рекомендуется первый подход.

person Masudul    schedule 28.09.2013
comment
просто создайте объект роли с идентификатором и установите его на рабочий объект пользователя. Спасибо. И у пользователя есть коллекция адресов, и он сделал ленивую инициализацию, чтобы избежать загрузки всего адреса, когда я извлекаю объект пользователя. Но если я хочу получить всех пользователей с адресом, как вы можете его получить. это может быть простой вопрос, потому что я новичок в спящем режиме? - person Karesh A; 28.09.2013
comment
Если вы определите ленивую инициализацию, то адрес не будет загружен пользователем. Когда вы вызываете user.getAddress(), адресный запрос сработает в базе данных и загрузит адрес с пользовательской таблицей. - person Masudul; 28.09.2013