如何在Hibernate中加载具有多对多关系的对象的一些列

发布于 2024-12-23 10:59:16 字数 2710 浏览 5 评论 0原文

使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

伊面 2024-12-30 10:59:16

您应该只需使用 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文