Hibernate:使用两个表进行多对一映射

时间:2014-02-14 05:13:32

标签: java hibernate

我有两张表Users(id,name,email,role_id)role(id,type) 我在用户bean中使用@ManyToOne (cascade=CascadeType.ALL)角色 因此,每次都会插入一个新角色。 但我希望用户使用角色表的现有条目。 请帮忙

4 个答案:

答案 0 :(得分:1)

您需要先找到现有的Role对象,然后将其设置为User对象。

换句话说,在保存用户之前,需要已经创建和管理Role对象。

答案 1 :(得分:1)

我想

@Entity
public class Users{
  @Id
  private int id;
  private String email;
  @ManyToOne(cascade=CascadeType.ALL)
  private Role role_id;
}

@Entity
public class Role{
    @Id
    private int id;
    private String type;
 } 

使用JPA

首先创建角色

Role role1 = new Role(1,"Role1");
Role role2 = new Role(2,"Role2");

然后将角色添加到用户

User user1 = new User(1,"User1","mail",role1);

EntityManager em = ....
em.persist(user1);

由于我们有级联选项role1而user1将保存在数据库中,所以不要忘记使用事务来执行此操作

如果要使用预先存在的角色,请考虑先从数据库中检索它

Role existingRole = em.find(Role.class, 1);
User user1 = new User(1,"User1","mail",existingRole );

EntityManager em = ....
em.persist(user1);

答案 2 :(得分:0)

除了使用@ManyToOne注释的用户之外,在用户中为role_id保留一个单独的@Column然后设置 role_id到用户并持久保存用户。你不需要级联所以删除它以使casacade类型为none而不是ALL。在@ManyToOne中你应该给出insertable = false& updatable = false以避免重复列问题。

See this example

答案 3 :(得分:0)

考虑到用户和角色中的id列都是主键,您需要的是当新用户首先通过数据库中的类型检索所需角色时,然后只需在用户实体中设置该角色并保留该用户