【问题标题】:How to use JPA to generate jointable where an entity joins with a join table?如何使用 JPA 在实体与连接表连接的地方生成可连接?
【发布时间】:2017-05-02 07:44:32
【问题描述】:

我正在尝试为此 SO question 实现用户角色团队组模型的 JPA 实体 POJO

这是架构的 ERD:

ER Diagram

我无法弄清楚 JPA 中的实体模型。

这是我正在处理的一些代码

账户实体

@Entity
public class Account extends BaseEntity {

@Id
@GeneratedValue
private Long accountId;
private String username;
private String password;
private boolean accountNonExpired;
private boolean accountNonLocked;
private boolean credentialsNonExpired;
private boolean enabled;

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "ACCOUNT_ROLE", joinColumns = @JoinColumn(name = "ACCOUNT_ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID"))
private Set<Role> userRoles;

角色实体

@Entity
public class Role extends BaseEntity {

@Id
@GeneratedValue
private Long roleId;
private String roleName;

BaseEntity 只是带有@PrePersist 和@PreUpdate 的公共字段

例如,如何使用 Account 和 Roles 之间的连接将 Teams 添加到此处?

更新:

我能够使用以下代码获得所需的表结构:

帐户:

@Entity
public class Accounts extends BaseEntity {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private Long id;
private String username;
private String password;
private boolean accountNonExpired;
private boolean accountNonLocked;
private boolean credentialsNonExpired;
private boolean enabled;
private boolean ldapManaged;


@OneToMany(mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval = true)
private List<AccountsRoles> roles = new ArrayList<>();

组:

@Entity
public class Groups extends BaseEntity {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private Long id;
private String name;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(name = "ACCOUNTS_ROLES_GROUPS")
private List<AccountsGroups> accounts;

角色:

@Entity
public class Roles extends BaseEntity {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private Long id;
private String roleName;

@OneToMany(mappedBy = "role", cascade = CascadeType.ALL, orphanRemoval = true)
private List<AccountsRoles> accounts = new ArrayList<>();

团队:

@Entity
public class Teams extends BaseEntity{

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private Long id;
private String name;
private String managerEmail;
private String teamLeadEmail;
private String distributionListEmail;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(name = "ACCOUNTS_ROLES_TEAMS")
List<AccountsRoles> accounts;

帐户组:

@Entity
public class AccountsGroups implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;


@Id
@ManyToOne
private Accounts account;

@Id
@ManyToOne
private Groups group;

}

AccountsRoles:

@Entity
public class AccountsRoles implements Serializable {
/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@ManyToOne
private Accounts account;

@Id
@ManyToOne
private Roles role;

但是,我不确定如何在链条中导航。

例如我如何获得帐户 -> 角色 -> 团队 -> 组

【问题讨论】:

  • 您不会在其他关系中引用某个连接表,因为连接表仅代表第一个关系。如果你想利用那里的数据,你可以发明一些其他实体来表示连接表。

标签: java hibernate jpa


【解决方案1】:
@Entity
public class Account extends BaseEntity {
...
@OneToMany(mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<AccountRole> userRoles;
}

@Entity
public class AccountRole {
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER) //don't delete with cascade
@JoinColumn(name = "account_id", nullable = false)
private Account account;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER) //don't delete with cascade
@JoinColumn(name = "role_id", nullable = false)
private Role role;
}

【讨论】:

  • 谢谢@PeterŠály,我会尝试这种方法。所以我假设,然后将 Teams 添加到此,我必须使用新的 AccountRole 实体加入 Team?
  • @NeilDCruz 实体 Team 和 Role 将具有属性 AccountRole。创建实体并检查生成的模型是否适合您的 ERD。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 2017-10-07
  • 2011-06-27
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多