我有实体使用权和角色与多对多关系,由关联实体 RoleUserentity 实现打破多对多关系分成两个一对多的关系。
使用 - > RoleUserentity < - 角色
正如我在Hibernate旧版本中所记得的那样,查询
来自使用,其中 userId = 1
返回 Userentity 对象,仅包含 userentity 表中的数据,并且不包含关系一对多(多对多)的表中的数据)[已经看到包含一对一和多对一的数据]。 要从一对多表中获取数据,我们必须编写连接查询
从使用权利内连接 u.roleUserentities ru 中选择你 u.userId = 1
但是,正如我所看到的,Hibernate 4也会使用来自一对多表( RoleUserentity )的数据返回 Userentity 对象
来自使用,其中 userId = 1
这种情况发生在Hibernate 4的纯实现和Jpa实现中,我以多种不同的方式进行了检查。 这对开发人员来说很容易,但只需要来自特定实体的数据(使用),这是一个不必要的处理时间和消耗。
所以任何人都知道如何仅从特定实体检索数据,防止来自Hibernate 4中其他实体的数据???如果必须在hibernate配置中设置一个适用于所有实体和查询的简单属性,那就更好了。
Netbeans IDE向导生成的实体类。 (首先,我在Eclipse中工作时遇到了这种情况) ---使用--- ---
@Entity
@Table(name = "userentity")
@NamedQueries({
@NamedQuery(name = "Userentity.findAll", query = "SELECT u FROM Userentity u")})
public class Userentity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "user_id")
private Integer userId;
@Column(name = "name")
private String name;
@Basic(optional = false)
@Column(name = "status")
private short status;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "userentity", fetch = FetchType.LAZY)
private List<RoleUserentity> roleUserentityList;
@OneToMany(mappedBy = "userId")
private List<Payment> paymentList;
public Userentity() {
}
public Userentity(Integer userId) {
this.userId = userId;
}
public Userentity(Integer userId, short status) {
this.userId = userId;
this.status = status;
}
// getters and setters
}
--- RoleUserentity ---
@Entity
@Table(name = "role_userentity")
@NamedQueries({
@NamedQuery(name = "RoleUserentity.findAll", query = "SELECT r FROM RoleUserentity r")})
public class RoleUserentity implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
protected RoleUserentityPK roleUserentityPK;
@Column(name = "date_from")
@Temporal(TemporalType.TIMESTAMP)
private Date dateFrom;
@Column(name = "date_to")
@Temporal(TemporalType.TIMESTAMP)
private Date dateTo;
@Basic(optional = false)
@Column(name = "status")
private short status;
@JoinColumn(name = "role_id", referencedColumnName = "role_id", insertable = false, updatable = false)
@ManyToOne(optional = false)
private Role role;
@JoinColumn(name = "user_id", referencedColumnName = "user_id", insertable = false, updatable = false)
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private Userentity userentity;
public RoleUserentity() {
}
public RoleUserentity(RoleUserentityPK roleUserentityPK) {
this.roleUserentityPK = roleUserentityPK;
}
public RoleUserentity(RoleUserentityPK roleUserentityPK, short status) {
this.roleUserentityPK = roleUserentityPK;
this.status = status;
}
public RoleUserentity(int roleId, int userId) {
this.roleUserentityPK = new RoleUserentityPK(roleId, userId);
}
// getters and setters
}
--- Servlet代码---
SessionFactory factory = new Configuration().configure().buildSessionFactory();
Session s = factory.openSession();
Userentity u = (Userentity)s.createQuery("select u from Userentity u where u.userId=1").uniqueResult();
out.println(((RoleUserentity)u.getRoleUserentityList().get(0)).getRole().getName());
s.close();
在第3行中,我使用了s.get(),s.load(),还有早期的Jpa EntityManager.findById(),然后是Spring CrudRepository中的findOne()。但结果仍然相同。