bernate中间表配置其他字段(列) annotation不知道怎么配置~

来源:互联网 发布:网络招商 编辑:程序博客网 时间:2024/05/01 05:43
 

Hibernate多对多中间关系表有属性(其他字段)的配制方法

分类: J2EE2010-05-17 11:371138人阅读评论(2)收藏举报

Hibernate框架可以将面向关系的 数据库模型封装成面向对象的数据库模型,这样以来一方面了我们在具体应用中的数据库设计,另一方面又简化了我们的编码。然而在现实中我们往往会发现有些面 向关系的数据库模型转化成面向对象的数据库模型之后很难再Hibernate中 配置。比如:在多对多关系模型中,中间表往往含有自己的属性,这种情况在Hibernate中 该如何配置?我在网上查了好多资料都说将多对多拆成两个一对多的方式来解决,这样做也不错,不过我个人觉得使用起来比较麻烦,更主要的一点是这种方法将Hibernate面向对象的设计思想降低到了关系型设计,Hibernate带来的好处就只有编码方便这一点了。


下面我给大家提供一种Hibernate中 多对多关系表中有属性的使用方法。

1、Project和 Programmer的 实体关系图如下:

2、将project 、programmer、participate封装成三个实体

view plaincopy to clipboardprint?
  1. public class Project {
  2. private Integer projectId;
  3. private String projectNumber;
  4. private String projectName;
  5. private Map programmers;
  6. get..
  7. set..
  8. }
  9. public class Programmer {
  10. private Integer programmerId;
  11. private String programmerName;
  12. private Map projects;
  13. get..
  14. set..
  15. }
  16. public class Participate {
  17. private Date startDate;
  18. private Date endDate;
  19. get..
  20. set..
  21. }
public class Project { private Integer projectId; private String projectNumber; private String projectName; private Map programmers; get.. set.. } public class Programmer { private Integer programmerId; private String programmerName; private Map projects; get.. set.. } public class Participate { private Date startDate; private Date endDate; get.. set.. }

3、配置属性文件

Project.hbm.xml

view plaincopy to clipboardprint?
  1. <hibernate-mapping >
  2. <class name="Project" table="test.tb_project">
  3. <id name="projectId">
  4. <column name="id" />
  5. <generator class="native"/>
  6. </id>
  7. <property name="projectNumber" >
  8. <column name="project_number" />
  9. </property>
  10. <property name=" projectName " >
  11. <column name=" project_name" />
  12. </property>
  13. <map name="programmers" table="test.tb_project_programmer" lazy="false">
  14. <key column="project_id" not-null="true"/>
  15. <map-key-many-to-many column="programmer_id" class="Programmer"/>
  16. <composite-element class="Participate">
  17. <property name=" startDate " column="start_date"/>
  18. <property name=" endDate " column="end_date"/>
  19. </composite-element>
  20. </map>
  21. </class>
  22. </hibernate-mapping>
<hibernate-mapping > <class name="Project" table="test.tb_project"> <id name="projectId"> <column name="id" /> <generator class="native"/> </id> <property name="projectNumber" > <column name="project_number" /> </property> <property name=" projectName " > <column name=" project_name" /> </property> <map name="programmers" table="test.tb_project_programmer" lazy="false"> <key column="project_id" not-null="true"/> <map-key-many-to-many column="programmer_id" class="Programmer"/> <composite-element class="Participate"> <property name=" startDate " column="start_date"/> <property name=" endDate " column="end_date"/> </composite-element> </map> </class> </hibernate-mapping>

Programmer.hbm.xml


view plaincopy to clipboardprint?
  1. <hibernate-mapping >
  2. <class name="Programmer" table="test.tb_programmer" lasy=”false”>
  3. <id name="programmerId">
  4. <column name="id" />
  5. <generator class="native"/>
  6. </id>
  7. <property name="programmerName" >
  8. <column name="programmer_name" />
  9. </property>
  10. <map name="projects" table="test.tb_project_programmer" lazy="false" inverse=”true”>
  11. <key column=" programmer _id" not-null="true"/>
  12. <map-key-many-to-many column="project_id" class="Project"/>
  13. <composite-element class="Participate">
  14. <property name=" startDate " column="start_date"/>
  15. <property name=" endDate " column="end_date"/>
  16. </composite-element>
  17. </map>
  18. </class>
  19. </hibernate-mapping>
<hibernate-mapping > <class name="Programmer" table="test.tb_programmer" lasy=”false”> <id name="programmerId"> <column name="id" /> <generator class="native"/> </id> <property name="programmerName" > <column name="programmer_name" /> </property> <map name="projects" table="test.tb_project_programmer" lazy="false" inverse=”true”> <key column=" programmer _id" not-null="true"/> <map-key-many-to-many column="project_id" class="Project"/> <composite-element class="Participate"> <property name=" startDate " column="start_date"/> <property name=" endDate " column="end_date"/> </composite-element> </map> </class> </hibernate-mapping>

4、你调用调试就可以了

注意:

在 其中一方要用inverse=“true”来实现控制翻转,在这一方的<calss />要添加lasy=“false”的属性,以便对方控制。