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

Java Hibernate 4:从特定表检索数据时防止相关表数据,java,mysql,hibernate,Java,Mysql,Hibernate,我有具有多对多关系的实体Userentity和Role,通过关联实体RoleUserentity将多对多打破为两个一对多关系来实现 Userentity->RoleUserentity不将关联标记为已抓取。您根本没有发布任何代码,因此我们无法向您指出错误所在。请使用lazy Fetching,或者可能使用投影,我将lazy fetch放在Userentity和RoleUserentity两侧。但仍然有问题。您正在呼叫u.getRoleUserentityList.get0。所以很明显,此时必须加

我有具有多对多关系的实体Userentity和Role,通过关联实体RoleUserentity将多对多打破为两个一对多关系来实现


Userentity->RoleUserentity不将关联标记为已抓取。您根本没有发布任何代码,因此我们无法向您指出错误所在。请使用lazy Fetching,或者可能使用投影,我将lazy fetch放在Userentity和RoleUserentity两侧。但仍然有问题。您正在呼叫u.getRoleUserentityList.get0。所以很明显,此时必须加载RoleUserentity列表。如果hibernate没有加载列表,它怎么能给你列表的第一个元素呢?这种情况发生在@OneToMany上,对@ManyToMany没有影响。这似乎也发生在Hibernate3中。
@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
}
@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         
}
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();