Hibernate 4:从特定表中检索数据时,防止相关表数据

时间:2014-10-29 07:54:32

标签: java mysql hibernate

我有实体使用权角色与多对多关系,由关联实体 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()。但结果仍然相同。

0 个答案:

没有答案