`
hahalzb
  • 浏览: 166175 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate annotation树状结构的映射

阅读更多
表结构如下:
引用

create table org (
id int not null primary key auto_increment,
name int,
pid int
)


实体Org
/**
 * 组织机构树
 * @author zhibinli
 */
@Entity
public class Org {
    private int id;
    private String name;
    private Set<Org> chileren = new HashSet<Org>();//一对多
    private Org org;//多对一 双向映射

    @OneToMany(mappedBy="org",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
    public Set<Org> getChileren() {
        return chileren;
    }

    public void setChileren(Set<Org> chileren) {
        this.chileren = chileren;
    }

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @ManyToOne
    @JoinColumn(name="pid")
    public Org getOrg() {
        return org;
    }

    public void setOrg(Org org) {
        this.org = org;
    }

}


这里存在一个双向的一对多或者说多对一,对于父节点来说,它与子节点是一对多的关系,对于子节点来说,它与父节点是多对一的关系。即在同一个类里一对多与多对一构成双向映射。
测试例子如下:

public class HibernateTest {
    private static SessionFactory sf = null;
    @BeforeClass
    public static void beforeClass() {
        sf = new AnnotationConfiguration().configure().buildSessionFactory();
    }
    @Test
     public void testSave() throws Exception {
        Session s = sf.getCurrentSession();
        org.hibernate.Transaction t = s.beginTransaction();
        Student student = new Student();
        student.setName("lzb");
        Org o = new Org();
        o.setName("总公司");
        Org o1 = new Org();
        Org o2 = new Org();
        Org o11 = new Org();
        Org o21 = new Org();
        o1.setName("分公司1");
        o2.setName("分公司2");
        o11.setName("分公司1下分公司1");
        o21.setName("分公司2下分公司1");
        //设置双方关系
        o.getChileren().add(o1);
        o.getChileren().add(o2);
        o1.setOrg(o);
        o2.setOrg(o);
        o1.getChileren().add(o11);
        o11.setOrg(o1);
        o2.getChileren().add(o21);
        o21.setOrg(o2);
        s.save(o);
        t.commit();
    }
    @Test
    public void testLoad() throws Exception {
        Session s = sf.getCurrentSession();
        Transaction t = s.beginTransaction();
        Org o = (Org)s.load(Org.class, 1);
        printOrg(o,0);
        t.commit();
    }
    /**
     * 典型的递归打印树
     * @param o 节点
     * @param level 节点层次
     * @throws java.lang.Exception
     */
    public void printOrg(Org o,int level) throws Exception {
        String s = "";
        for(int i=0;i<level;i++) {
            s+="----";
        }
        System.out.println(s+o.getName());
        Set<Org> children = o.getChileren();
        
        for(Org temp : children) {
            printOrg(temp,level+1);
        }
        
    }
     @AfterClass
     public static void afterClass() {
         sf.close();
     }
}
1
0
分享到:
评论

相关推荐

    java自学路线图java自学路线图.doc

    树状结构存储对于复杂数据的组织很有帮助,存储过程和触发器可实现自动化任务。 3. **JDBC**:Java Database Connectivity是Java与数据库交互的标准API。了解JDBC基础,包括连接数据库、执行SQL语句和处理结果集。...

    JAVA自学之路 七路线图明细

    理解树状结构存储,以及存储过程和触发器的编写。 4. **JDBC**:学习JDBC基础,包括如何建立数据库连接,使用Statement和PreparedStatement执行SQL。了解连接池(如C3P0, DBCP)和DataSource。掌握RowSet和...

    java学习流程介绍以及java核心思想

    了解树状结构存储,以及存储过程和触发器的应用。 3. **JDBC(Java Database Connectivity)**:JDBC是Java连接数据库的标准接口,包括基础的数据库连接、数据源DataSource和RowSet的使用。理解JDBC连接Oracle和...

    Java自学知识点参考.doc

    树状结构存储数据,学习存储过程和触发器的创建和调用。 3. **JDBC**: JDBC是Java数据库连接,用于与数据库交互。理解基础的数据库连接,连接池提高性能,DataSource和RowSet管理数据。了解如何针对Oracle和MySQL...

    j2ee学习路径 对初学者很有帮助

    理解树状结构存储,以及存储过程和触发器的应用。数据库设计遵循的范式(第一、第二、第三范式)也非常重要。 3. **JDBC**:Java数据库连接(JDBC)是与数据库交互的基础,需要了解JDBC的基础知识,如连接池的使用...

    java自学之路num1

    学习树状结构的存储,以及存储过程和触发器的编写。数据库设计遵循三范式原则,以保证数据的一致性和完整性。 3. **JDBC**:Java数据库连接,用于与数据库交互。理解JDBC的基础,如建立连接、执行SQL、处理结果集。...

    java知识点汇总学习路线与笔记

    - **树状结构存储**:某些特定场景下,如组织结构或分类信息,使用树状结构进行存储更合适。 - **存储过程、触发器**:存储过程是一组预编译的SQL语句,可以在数据库中执行复杂的逻辑;触发器是当特定事件发生时自动...

    J2EE学习路线及重要知识点.pdf

    2. **数据库知识**:无论是Oracle还是MySQL,理解SQL语句(增删改查,多表连接,内外连接,子查询),数据库管理(表,视图,索引,序列,约束),树状结构存储,存储过程,触发器,以及数据库设计的三大范式是必要...

    java 学习的顺序(初学者)

    理解树状结构存储,以及存储过程和触发器的使用。 3. **JDBC编程**:学习JDBC基础,包括连接数据库、执行SQL语句、处理结果集。了解连接池和数据源的使用,以及JDBC连接Oracle、MySQL和SQL Server 2005/2000的方法...

Global site tag (gtag.js) - Google Analytics