休眠从onetomany检索列表

Sve*_*ven 2 java orm hibernate hql

我设法(正如你在我的旧帖子中看到的那样)通过休眠插入了一个 onetomany 关系。我的两个实体类如下所示:

项目.java:

@Entity
public class Project {

 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private int id; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy="project")
    @OrderColumn(name = "project_index")
    List<Application> applications;
....
Run Code Online (Sandbox Code Playgroud)

Application.java(项目的子项目。一个项目可以有多个应用程序,但一个应用程序只属于一个项目)

@Entity
public class Application {

 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private int id;
    @ManyToOne
    @JoinColumn(name = "project_id")
    private Project project;
...
Run Code Online (Sandbox Code Playgroud)

到目前为止,插入数据效果很好。但是从我的数据库中获取数据是问题所在。我尝试了两种方法:


方式 1:我检索一个项目并尝试从列表属性中获取应用程序。但不幸的是,应用程序实体位于“存储快照”中,这对我来说似乎很错误。这是我的调试屏幕的屏幕截图:

替代文字

其实这种方法有效!我在其他地方犯了一些错误......


方式2:我尝试通过sql查询检索所有应用程序的列表:

public List<Application> getApplications(int project_id) {
  Session session = HibernateUtil.getSessionFactory().getCurrentSession();
  session.beginTransaction();
  List<Application> applications = session.createQuery("from Application a where a.project_id=" + project_id + " ").list();
  return applications;
 }
Run Code Online (Sandbox Code Playgroud)

..抛出奇怪的异常-.-

org.hibernate.QueryException: 无法解析属性:project_id of: de..common.entities.Application [from de..common.entities.Application a where a.project_id=1 ]

方法 2 的问题是我混淆了 SQL 和 HQL。


对休眠初学者的一点帮助会很棒:-)干杯..

Boz*_*zho 5

您应该能够通过简单的方式访问应用程序:

List<Application> applications = project.getApplications();
Run Code Online (Sandbox Code Playgroud)

PersistentBag正在实施,java.util.List所以你不应该关心它的内部。

你只需要一个开放的会话来做到这一点,否则LazyInitializationException将被抛出。