2010-09-08 90 views
1

我管理(如你可以在我的旧帖子中看到的)通过hibernate插入一个onetomany关系。我的两个实体类看起来像下面:休眠从onetomany检索列表

Project.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; 
.... 

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

@Entity 
public class Application { 

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

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


方法1:我恢复项目,并得到了应用程序列表属性。但不幸的是,应用程序实体处于'storedSnapshot'中,这对我来说似乎很不妥。下面是截图从我的调试屏幕:

alt text

其实这样的作品!我做了一些错误,别的地方...


方式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; 
} 

..这将引发异常诡异 - -

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

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


对Hibernate初学者一点帮助将是巨大的:-) 干杯..

+0

什么在'bag'? – Bozho 2010-09-08 11:42:26

+0

解释storedSnapshot究竟有什么问题? – wds 2010-09-08 11:53:34

+0

@Bozho:你在谈论什么包 – Sven 2010-09-08 12:07:43

回答

4

您应该能够通过简单地访问应用程序:

List<Application> applications = project.getApplications(); 

PersistentBag是实现java.util.List所以你不应该在乎它的内部。

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

+0

其实它的工作原理!我的错误必须在其他地方,为你的时间而努力... – Sven 2010-09-08 12:36:13

1

对于方式1:我不知道StoredSnapshot,但尝试设置FetchType为您的应用程序列表到“EAGER”。也许这会解决它。

对于方法2:您在数据模型上创建查询,而不是在数据库上创建查询。所以这些字段应该是你的java映射中的字段。在这种情况下:

 
List applications = session.createQuery("from Application a where a.project=" + project).list(); 

请注意,传递给函数的参数应该是类型为Project而不是类型为int的参数。

此外,通过使用一个命名查询,你可以这样做:

 
@NamedQuery(name="projectById", 
      query="SELECT p FROM Project p" 
        + " LEFT JOIN FETCH applications" 
      ) 
+0

好吧,谢谢我,我会尝试。好像我混淆了SQL与HQL – Sven 2010-09-08 12:08:38

2

我尝试检索通过SQL查询(...)会抛出异常奇特的所有应用程序的列表

唯一的例外是不奇怪的,正好告诉你什么是错的:Application没有按”没有任何project_id属性,这是真的(project_id是数据库列)。

您的查询不是SQL查询,这是一个JPQL查询。 JPQL查询是针对实体(对象)及其关联执行的。所以你需要考虑对象和关联。

在你的情况,(假设你不已经有一个Project实例,但只有一个项目id),你可以做这样的事情:

Query q = session.createQuery("FROM Application a WHERE a.project.id = :id"); 
q.setParameter("id", project_id); 
List<Application> applications = (List<Application>) q.list(); 
+0

世界多么容易^^ – Sven 2010-09-09 06:13:15

+0

@Sven不是吗? – 2010-09-09 06:17:46

+0

如果你是一个拥有所有框架和语言的初学者,则不行;-) – Sven 2010-09-09 07:34:24