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