Hibernate Mapping

时间:2015-04-09 14:16:50

标签: java mysql hibernate

我是hibernate的新手,并试图理解它。我有以下表格: -

我们有session_tbl表格如下: -

Session_ID | Creation_Time  
1          | 23-Mar-2014
2          | 24-Mar-2014
3          | 25-Mar-2014
4          | 26-Mar-2014


and stock_tbl as below :- 

Stock_id   | price   | session_id
1          | 11.00   | 1
2          | 12.00   | 1
3          | 43.00   | 1
4          | 51.00   | 2
5          | 85.00   | 4
6          | 61.00   | 3
7          | 66.00   | 2
8          | 81.00   | 1
上面session_id中的

用作session_tbl的外键。

hibernate中,我们如何在xml文件中指定映射? 我只想提取stock_tbl数据,我永远不会查询session_tbl来获取库存。

我们需要在Session_tbl类中创建Stock_tbl个对象。但没有Stock_tbl类的Session_tbl对象。

我们希望使用session_tbl进行跟踪,我们有超过100个表,其中session_tbl作为所有表中的外键。在这种情况下,我们必须为Session_tbl中的所有类设置Set。因为我们只需要来自Stock_tbl的会话详细信息,所有剩余的99个表(当需要fetch session_tbl时 - 延迟加载)。

我创建了如下映射: -

public class Session_tbl {
   private int session_id;
   private String dateTime; 
   private Set<Stock_tbl> stockTbl;
   // Question 1 


.. Getter and Setter
}

public class Stock_tbl{
   private int stock_id;
   private Session_tbl sessionTbl;
   private int price; 

.. Getter and Setter
}

<class name="Session_tbl" table="session_tbl">

      <id name="session_id" type="int" column="session_id">
         <generator class="native"/>
      </id>
      <set name="stockTbl" cascade="all">
         <key column="stock_id"/>
         <one-to-many class="Stock_tbl"/>
      </set>
      // Question 2
......

</Class>

<class name="Stock_tbl" table="stock_tbl">

      <id name="stock_id" type="int" column="stock_id">
         <generator class="native"/>
      </id>
      ....
   </class>

问题:

  1. 为什么我需要在Session_tbl类中使用set,因为我不想从这里获取股票?我只需要下面的课程中的Session_tbl对象。

  2. 为什么在Sesison_tbl表中需要这种映射?对于所有100个班级,我必须在这里创建映射吗?

1 个答案:

答案 0 :(得分:1)

您只能在Stock_tbl类中定义关系的ManyToOne部分。 如果他们不想将sessionip用于Session,则无需向Session_tbl类或100个类中的任何其他类添加任何内容。

<class name="Stock_tbl" table="stock_tbl">

      <id name="stock_id" type="int" column="stock_id">
         <generator class="native"/>
      </id>
      <many-to-one name="sessionTbl" column="session_id" class="Session_tbl" not-null="true"/>
      ....
</class>
<class name="Session_tbl" table="session_tbl">

      <id name="session_id" type="int" column="session_id">
         <generator class="native"/>
      </id>
      //remove the stockTbl field from the Session class
</Class>

使用anotation(建议使用代替xml作为代码旁边的映射),它看起来就是这样:

@Entity
public class Stock_tbl{
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private int stock_id;
   @ManyToOne
   @JoinColumn(name="session_id")
   private Session_tbl sessionTbl;
   private int price; 

.. Getter and Setter
}

@Entity
public class Session_tbl {
   @GeneratedValue(strategy = GenerationType.AUTO)
   private int session_id;
   private String dateTime; 
   //remove the stock if you dont want to use it
.. Getter and Setter
}

除非你的意思是你真的不想拥有Session类。 然后,您不提供任何Session_tbl映射。 在Stock_tbl中,你只定义了session_id的列,你需要自己处理它(即设置正确的sessionId值)。

@Entity
public class Stock_tbl{
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private int stock_id;

   private int session_id; //now it is a simple id, not relationships/objectc
   private int price; 
.. Getter and Setter
}