1

我打算用hibernate设计一个新系统。例如,如果我创建一个带有映射的休眠类

@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 获取角色对象并添加到用户对象并保存它。如果我将这样的映射定义到其他复杂的设计类,我必须从 db.xml 获取相关的映射类。我觉得这对 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;
 ....
}

在这种情况下,我可以将 id 添加到用户对象并保存。但是数据库类不会被映射。如果我对所有类都这样做,我将拥有没有在 db 内映射的 db 表如果我这样做是为了获取角色名称,我必须创建另一个 sql 来获取角色。

因此,在保存对象的第一种方法中,我得到了对象并保存,而在第二种方法中,我们必须创建两个 sql 来获取这两个对象。这是实现它的好方法吗?

从这两个设置中,哪个好,高效且易于使用?请讨论推荐的方式吗?

4

1 回答 1

1

在这种情况下,每次我将用户添加到数据库时,我都必须从 db 获取角色对象并添加到用户对象并保存它。如果我将这样的映射定义到其他复杂的设计类,我必须从 db.xml 获取相关的映射类。我觉得这对 db 来说是一个额外的负担。他们有什么有效的方法吗?

在这里,您没有从数据库加载角色对象。您应该只创建一个角色实例并将其添加到用户。

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

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

如果将角色与用户级联,则可以减少重复saveOrUpdate()操作。

从这两个设置中,哪个好,高效且易于使用?请讨论推荐的方式吗?

一般来说,对于 JDBC 身份验证,角色和用户表应该是分开映射的。因此,建议使用第一种方法。

于 2013-09-28T11:41:27.713 回答