2011-11-07 148 views
0

我正在用java制作一个电子邮件客户端。当用户使用附件(文档)创建邮件时,它会将所有关于电子邮件的数据保存在数据库中,但保存在多个表中,如Document_table.title中的附件标题,msgnumber.num中的邮件数量,msgnumber.date中的日期,发件人的名称在Official_Person.name和OfficialPerson.secondname中。 我如何检索所有这些数据并显示它(即时使用Jtable为此)?我知道如何获取数据,如果它保存在一个表中,但不是多个。请帮帮我。休眠帮我写查询

一种格式有很多文档。

文献:

@Entity 
@Table(name="DOCUMENT" 
    ,schema="Default" 
) 
public class Document implements java.io.Serializable { 

@ManyToOne 
     @JoinColumn(name = "FormatID") 
private Format format; 
    @Id 
    @Column(name = "DocumentID", unique = true, nullable = false) 
    private int documentId; 

FORMAT:

@Entity 
@Table(name="FORMAT" 
    ,schema="Default" 
) 
public class Format implements java.io.Serializable { 


    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinColumn(name = "FormatID") 
    private Set<Document> documents = new HashSet(); 

    @Id 
    @Column(name = "FormatID", unique = true, nullable = false) 
    private int formatId; 

format.hbm

<hibernate-mapping> 
    <class name="entity2.Format" table="FORMAT"> 
     <id name="formatId" type="int"> 
      <column name="FormatID" length="2000000000" /> 
      <generator class="native" /> 
     </id> 
       <set name="documents" table="DOCUMENT" 
       inverse="true" lazy="true" fetch="select"> 
      <key> 
       <column name="FormatID" not-null="true" /> 
      </key> 
      <one-to-many class="entity2.Document" /> 
     </set> 

document.hbm

<hibernate-mapping> 
    <class name="entity2.Document" table="DOCUMENT"> 
     <id name="documentId" type="int"> 
      <column name="DocumentID" length="2000000000" /> 
      <generator class="native" /> 
     </id> 

     <many-to-one name="format" class="entity2.Format" fetch="select"> 
      <column name="FormatID" not-null="true" /> 
     </many-to-one> 

我要检索的所有文件格式1:

Session session = HibernateUtil.getSessionFactory().openSession(); 
     session.beginTransaction(); 
     Format f = (Format) session.get(Format.class, 1); 
System.out.println(f.getName()); 
     System.out.println(f.getDocuments()); 

文件是空的?我在哪里错了?

回答

1

如果定义,类之间的关系,例如:

class Person {  
    @OneToMany(cascade=CascadeType.ALL, 
       fetch= FetchType.EAGER) 
    private Set<Email> emails = new HashSet(); 

    // getters/setters and some other attributes are not shown 

当你从数据库中读取一个对象,你会得到自动与它有关系的另一个对象。

Session s = HibernateUtil.getSessionFactory().openSession(); 
Person p = (Person) s.get(Person.class, 1); 
s.close(); 

System.out.println(p.getName()); 
System.out.println(p.getEmails()); 

以下是双向一对一关系的示例。

class Person { 
    @OneToOne(cascade=CascadeType.ALL) 
    private Address address; 


class Address { 
    @OneToOne(mappedBy=”address”) 
    private Person person 
+0

谢谢你的回答。但是如果我的物体没有直接关系呢?他们通过代理表(对象)连接。 – bunnyjesse112

+1

我不知道代理表。 – wannik

+0

我的意思是他们没有直接关系通过ID – bunnyjesse112

1

您只需使用select语句为所有希望检索的值编写查询。 Hibernate将返回一个数组,其索引的顺序与select语句的顺序相同。

SELECT 由人AS P,AS A地址,顺序O,用户为u WHERE P.id = 5 AND A.personId = P.id AND O.personId = P.id 和U .personId = P.id

这将返回含有{人,地址,列表,用户}

+0

请问您能提供四个表格的例子吗?这真的会有所帮助。在此先感谢 – bunnyjesse112

+0

感谢您的回应! – bunnyjesse112

+1

说出感谢的最佳方式是投我的答案或将其标记为解决您的问题。 – Thom

1

Hibernate是ORM工具的阵列 - 的 “O” 代表 “对象”。从映射到您的表和列的电子邮件对象开始。然后使用HQL查询符合特定限制的Email实例。

JTable或网页是与您查询对象的方式不同的显示问题。

+0

感谢您的回答。我不知道如何编写多个表(对象)的hql查询。或者我需要创建一个代理对象?我没有电子邮件对象。 al数据存储在不同的表格中。 – bunnyjesse112

+1

是的,你有表格,但这些是ORM的“R”端。如果你没有对象,你不应该使用Hibernate。直接使用JDBC和SQL即可。 – duffymo

+0

感谢回复。我的意思是我有我的消息数据分布在多个类,并没有expirience检索它形成超过2个对象。而我的桌子不通过ID直接连接。 – bunnyjesse112