如何在Hibernate中加载具有多对多关系的对象的一些列
使用 Hibernate 从数据库加载对象时出现问题。
我有三个java类:“A”、“B”和“C”。 A 和 B 通过附加表“a_join_b”关联为多对多关系。 A 和 C 关联为多对一关系。
有代码:
@Entity
@Table(name = "A")
public class AclassEnt implements java.io.Serializable{
@Id
@TableGenerator(name = "inventory",
table = "hibernate_sequences",
pkColumnName = "sequence_name",
pkColumnValue = "Emp_Gen",
valueColumnName = "sequence_next_hi_value",
initialValue = 0,
allocationSize = 100)
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "A_ID", nullable = false)
private Integer aId;
@Column(name = "A_NUMBER", length = 20)
private String aNumber;
@Column(name = "A_NAME", length = 15)
private String aName;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE},
fetch = FetchType.EAGER,
targetEntity=WorkersEnt.class)
@JoinColumn(name="C_ID")
private CclassEnt cclass;
@ManyToMany(cascade = CascadeType.REFRESH,fetch = FetchType.LAZY,targetEntity = BclassEnt.class)
@JoinTable(name = "A_join_B", joinColumns = { @JoinColumn(name = "A_ID") }, inverseJoinColumns = { @JoinColumn(name = "B_ID") })
private Set<BclassEnt> BclassList=new HashSet<BclassEnt>();
//getters and settrs
}
@Entity
@Table(name = "B")
public class MeasureTypeEnt implements java.io.Serializable{
@Id
@TableGenerator(name = "inventory",
table = "hibernate_sequences",
pkColumnName = "sequence_name",
pkColumnValue = "Emp_Gen",
valueColumnName = "sequence_next_hi_value",
initialValue = 0,
allocationSize = 100)
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "B_ID", nullable = false)
private Integer bId;
@Basic(optional = false)
@Column(name = "B_NAME", nullable = false, length = 100)
private String bName;
//getters and setters
}
问题:如何加载带有十六进制字段的对象“AclassEnt”:aId、aName、cclass 和 BclassList ???
使用下一个代码,我可以加载我需要的所有列,除了最后一个。我的意思是“BclassList”。
Criteria crit = session.createCriteria(AclassEnt.class,"c");
crit.createAlias("cclass", "cclass")
.createAlias("BclassList", "BclassList")//<-- is it correctly?
.setProjection( Projections.projectionList()
.add(Projections.property("c.aId").as("aId"))
.add(Projections.property("c.aName").as("aName"))
.add(Projections.property("c.cclass").as("cclass"))
.add(Projections.property("c.BclassList").as("BclassList"))//<-- is it correctly?
);
AclassEnt result = crit.setResultTransformer(new AliasToBeanResultTransformer( AclassEnt.class )).list();
There is a problem with loading the object from the database using Hibernate.
I have three java classes: "A", "B" and "C".
A and B are associated as mamy-to-many relationship by an additional table "a_join_b".
A and C are associated as many-to-one relationship.
There is code:
@Entity
@Table(name = "A")
public class AclassEnt implements java.io.Serializable{
@Id
@TableGenerator(name = "inventory",
table = "hibernate_sequences",
pkColumnName = "sequence_name",
pkColumnValue = "Emp_Gen",
valueColumnName = "sequence_next_hi_value",
initialValue = 0,
allocationSize = 100)
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "A_ID", nullable = false)
private Integer aId;
@Column(name = "A_NUMBER", length = 20)
private String aNumber;
@Column(name = "A_NAME", length = 15)
private String aName;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE},
fetch = FetchType.EAGER,
targetEntity=WorkersEnt.class)
@JoinColumn(name="C_ID")
private CclassEnt cclass;
@ManyToMany(cascade = CascadeType.REFRESH,fetch = FetchType.LAZY,targetEntity = BclassEnt.class)
@JoinTable(name = "A_join_B", joinColumns = { @JoinColumn(name = "A_ID") }, inverseJoinColumns = { @JoinColumn(name = "B_ID") })
private Set<BclassEnt> BclassList=new HashSet<BclassEnt>();
//getters and settrs
}
@Entity
@Table(name = "B")
public class MeasureTypeEnt implements java.io.Serializable{
@Id
@TableGenerator(name = "inventory",
table = "hibernate_sequences",
pkColumnName = "sequence_name",
pkColumnValue = "Emp_Gen",
valueColumnName = "sequence_next_hi_value",
initialValue = 0,
allocationSize = 100)
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "B_ID", nullable = false)
private Integer bId;
@Basic(optional = false)
@Column(name = "B_NAME", nullable = false, length = 100)
private String bName;
//getters and setters
}
Question: how can I load object "AclassEnt" with hext fields: aId, aName,cclass and BclassList ???
Using next code I can load all cols what I need exept one last. I mean "BclassList".
Criteria crit = session.createCriteria(AclassEnt.class,"c");
crit.createAlias("cclass", "cclass")
.createAlias("BclassList", "BclassList")//<-- is it correctly?
.setProjection( Projections.projectionList()
.add(Projections.property("c.aId").as("aId"))
.add(Projections.property("c.aName").as("aName"))
.add(Projections.property("c.cclass").as("cclass"))
.add(Projections.property("c.BclassList").as("BclassList"))//<-- is it correctly?
);
AclassEnt result = crit.setResultTransformer(new AliasToBeanResultTransformer( AclassEnt.class )).list();
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您应该只需使用 A 类的 getter 即可访问 B 实体列表。在你的情况下 Set myAobject.getbClassList();
因此,您只需创建一个查询/条件来检索您的 A 实体。之后,只需调用 Set 的 getter 并对该 Set 进行操作即可。无需进行复杂的查询。
例如:currentSession().get(AclassEnt.class, 1);或 currentSession().createCriteria(AclassEnt.class).list(); ...
但是要小心,如果你有一个惰性获取并且你尝试在事务之外访问它,你会得到惰性异常。一个解决方案是让延迟获取变得急切。并且您不需要实例化 Set。
我不确定,所以我检查了文档,但您的单向 ManyToMany 关系定义似乎是正确的: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/ 2.2.5.3.2。多对多
you should have access to your B entity list just with the getter of the A class. In you case Set myAobject.getbClassList();
So you just have to create a query/criteria to retrieve your A entity. Afterwards, just call the getter of your Set and operate with the Set. No need to make complicated queries.
For example: currentSession().get(AclassEnt.class, 1); or currentSession().createCriteria(AclassEnt.class).list(); ...
But take care, if you have a Lazy fetching and you try to access it outside a transaction, you'll get lazyexceptions. A solution is to make lazy fetch eager. And you don't need to instantiate the Set.
I was unsure so I checked the doc, but your unidirection ManyToMany relation definition seems correct: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/ 2.2.5.3.2. Many-to-many