首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

hibernate投射2张表

2012-12-16 
hibernate映射2张表一个employee表,中有性别,权限,数据库写入这个字段的都是标识符还有一个s表,其中有一个

hibernate映射2张表
一个employee表,中有性别,权限,数据库写入这个字段的都是标识符

还有一个s表,其中有一个字段存放标识符,另外一个字段存放标识符对应的中文,

想通过性别,权限的标示符,对应systemdictionary表,找出性别权限对应的中文字符,显示出来。
hibernate怎么关联这2张表呢。hql语句怎么写呢

我是菜鸟!求大虾来指点一下
[最优解释]
假设有employee类和权限两个类;
其中:
employee类   有性别、权限等属性;
权限类       有权限id、权限名称等属性;
①明显,employee包含了权限,employee为关系维护端;
②而“多个”employee有相同的“一个”权限;
由上面可知,是单向多对一关系,employee为“多”方,权限为“一”方,由employee负责维护关系。

ok,接下来写hbm映射表。
employee的映射表(employee.hbm.xml):


<class name="com.corp.temp.employee" table="t_employee">
<id name="employeeId">
<generator class="native"/>
</id>
<property name="sex"/>
<!--增加多对一关联映射,此处name="group"是值实体类User.java中的group属性-->
<many-to-one name="权限" column="权限id"/>
</class>

权限的映射表(权限.hbm.xml):

<class name="com.corp.temp.权限" table="t_权限">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>


[其他解释]
又忘了编辑……

employee的映射表(employee.hbm.xml):
<class name="com.corp.temp.employee" table="t_employee">
    <id name="employeeId">
        <generator class="native"/>
    </id>
    <property name="sex"/>
    <!--增加多对一关联映射,此处name="权限"是值实体类权限.java中的名称属性。
        这里我额外加了级联cascade属性。
        意思是,在执行save或update方法时,会先保存被维护的另一端对象。-->
    <many-to-one name="权限" column="权限id" cascade="save-update"/>
</class>


在dao层,参考语句如下:


//存储例程
权限 qx = new 权限();
qx.setName("允许增加的权限");
session.save(qx);
Employee employee1 = new Employee();
employee1.setSex("男");
employee1.set权限(qx);
Employee employee2 = new Employee();
employee2.setSex("女");
employee2.set权限(qx);
session.save(employee1);
session.save(employee2);
//读取例程
//这里“1”代表id=1
Employee employee = (Employee)session.load(Employee.class, 1);
System.out.println("employee.sex=" + employee.getSex());
System.out.println("employee.权限.name=" + employee.get权限().getName());


至于说hql,楼主再找些资料吧。
不过,一定要注意,hql语句中的元素,如对象名、属性名等,都是java程序的元素,不是数据库元素。
[其他解释]
多个外键关联一下。。。
[其他解释]
s表
[其他解释]
这个属于多对一关联映射。
[其他解释]
是让employee表里的2个字段,同时与另外一张表的一个字段关联。。是多对一还是什么样的关联关系呢
[其他解释]
引用:
是让employee表里的2个字段,同时与另外一张表的一个字段关联。。是多对一还是什么样的关联关系呢


楼主,如果要回复的话,请点下楼层下面的“引用,我可能永远都不知道你回复了我。

hbm当中,每一个属性,映射于数据库中。
比如<property name="sex"/>,就是对应于数据库的sex字段。

而<many-to-one>、<one-to-one>、<one-to-many>、<many-to-many>都是一类。每个标签都会对应数据库中的“一个”字段,就相当于是一个特殊的<property>。



这些标签的特殊性就在于会与“其他表”发生关联,但只能与其他表的主键id发生联系。也就相当于A表中的“一个”字段,与数据表B中的“一个”字段发生关联。

而至于说“多对一”,则是指A表中的字段存在重复数据,“多个”重复数据对应B表中对应字段的“一个”数据。

[其他解释]

引用:
是让employee表里的2个字段,同时与另外一张表的一个字段关联。。是多对一还是什么样的关联关系呢


刚有句话没说清楚。
hbm当中,每一个属性,都只映射于数据库中的一个字段。
[其他解释]
引用:
是让employee表里的2个字段,同时与另外一张表的一个字段关联。。是多对一还是什么样的关联关系呢

继续用“employee”和“权限”来做例子。

我解释下“关联映射”的原理。

public class employee {
     private int id;
     private string sex;
     private 权限 qx;
     //set、get方法
}
//employee的映射表(employee.hbm.xml):
<class name="com.corp.temp.employee" table="t_employee">
    <id name="employeeId">
        <generator class="native"/>
    </id>
    <property name="sex"/>
    <!--增加多对一关联映射,此处name="权限"是值实体类“employee.java中”的权限属性。-->
    <many-to-one name="权限" column="权限id" cascade="save-update"/>
</class>


public class 权限 {
     private int id;
     private string name;
     //set、get方法
}
//权限的映射表(权限.hbm.xml):
<class name="com.corp.temp.权限" table="t_权限">
    <id name="id">
        <generator class="native"/>
    </id>
    <property name="name"/>
</class>


<many-to-one>是如何发生关联的呢?其关联顺序如下:
①找到employee.java中的“权限”类;
②由“权限”类找到其对应的权限.hbm.xml表;
③由权限.hbm.xml找到其主键id。
因此,many-to-one字段,存储的内容,是相应权限的id值。

因为employee中多个人具有同样的权限,所以在employee表的“权限id”字段中,存在“多个”重复的数据,对应权限表的id字段中的“一个”数据。
比如:
employee表:
id  sex  权限id
1     男       1
2     男       1
3     男       1
4     女       1
权限表:
id    name
1    增加的权限

这就是“多对一”

而如果要让多个用户拥有多个“权限”,那么应该用“多对多关联映射”
具体如下:

public class employee {
     private int id;
     private string sex;
     private 权限 qx;
     //set、get方法
}
//employee的映射表(employee.hbm.xml):
<class name="com.corp.temp.employee" table="t_employee">
    <id name="employeeId">
        <generator class="native"/>
    </id>
    <property name="sex"/>
    <!--增加多对多关联映射,此处name="权限"是值实体类“employee.java中”的权限属性。-->
    <set name="权限" table="t_employee_权限">
<key column="employee_id" not-null="true"/>
<many-to-many class="com.corp.project.权限" column="权限_id"/>


    </set>
</class>

]

public class 权限 {
     private int id;
     private string name;
     //set、get方法
}
//权限的映射表(权限.hbm.xml):
<class name="com.corp.temp.权限" table="t_权限">
    <id name="id">
        <generator class="native"/>
    </id>
    <property name="name"/>
</class>


这种配置方案需要一个中间表“t_employee_权限”。
数据库中的结构如下:
employee表:
id  sex
1     男
2     男
3     男
4     女

t_employee_权限表:
employee_id     权限_id
1                  1
1                  2
3                  3
2                  1
2                  2
3                  1
3                  2
4                  1

权限表:
id    name
1    增加的权限
2    删除的权限
3    修改的权限

关联的顺序如下:
①找到employee.java中的“权限”类;
②由“权限”类找到其对应的权限.hbm.xml表;
③由权限.hbm.xml找到其主键id。
顺序还是和“多对一”一样的。

但是为了存储“多对多”这种逻辑,就用了中间表t_employee_权限,来存储employeeid和权限_id。
可以看到中间表两个字段都存在“多个”重复的数据。
[其他解释]
引用:
引用:
是让employee表里的2个字段,同时与另外一张表的一个字段关联。。是多对一还是什么样的关联关系呢

楼主,如果要回复的话,请点下楼层下面的“引用,我可能永远都不知道你回复了我。

hbm当中,每一个属性,映射于数据库中。
比如<property name="sex"/>,就是对应于数……


我要是用employee表里的2个字段,都与另外一个表的一个字段关联。配置文件里,相关的属性,写的不就都是一样的么?
[其他解释]
引用:
我要是用employee表里的2个字段,都与另外一个表的一个字段关联。配置文件里,相关的属性,写的不就都是一样的么?

这样是不可能的。之前也说了,<many-to-one>、<one-to-one>、<one-to-many>、<many-to-many>这些标签的特殊性就在于会与“其他表”发生关联,但只能与其他表的主键id发生联系。也就相当于A表中的“一个”字段,与数据表B中的“一个”字段发生关联。
如果说2个字段都与另外一个表的一个字段关联,那么数据库设计上肯定存在问题,逻辑上也说不通。
说说看你“2个字段,都与另外一个表的一个字段关联”的详细情况。然后我再给你例子。
[其他解释]
引用:
引用:
我要是用employee表里的2个字段,都与另外一个表的一个字段关联。配置文件里,相关的属性,写的不就都是一样的么?
这样是不可能的。之前也说了,<many-to-one>、<one-to-one>、<one-to-many>、<many-to-many>这些标签的特殊性就在于会与“其他表”发生关联,但只能与其他表的主键id发生联系。也就相当于A表……

其实就是想查询Employee的实例。然后employee的表里含有2个字段,一个sex,一个role,在employee表里都是sys_gender,sys_role这样写入的。在页面就要显示出中文,是从别的表里对应过来的,原来的程序里是用sql查询。弄个left join就好了。。。两个字段都是根据条件就能判断了。。。要是换成用hibernate的hql查询,这样就行不通了。。还是这么2张表。想用hql进行查询。。

select s.name1 from employee e left join s on e.sex=s.key and s.type='sys_gender'




name1就是s表里的性别的汉字表示
[其他解释]

引用:
其实就是想查询Employee的实例。然后employee的表里含有2个字段,一个sex,一个role,在employee表里都是sys_gender,sys_role这样写入的。在页面就要显示出中文,是从别的表里对应过来的,原来的程序里是用sql查询。弄个left join就好了。。。两个字段都是根据条件就能判断了。。。要是换成用hibernate的hql查询,这样就行不通了。。还是这么2张表。想用hql进行查询。。
select s.name1 from employee e left join s on e.sex=s.key and s.type='sys_gender'
name1就是s表里的性别的汉字表示


employee不是有主键id么!!!晕死……
[其他解释]
引用:
其实就是想查询Employee的实例。然后employee的表里含有2个字段,一个sex,一个role,在employee表里都是sys_gender,sys_role这样写入的。在页面就要显示出中文,是从别的表里对应过来的,原来的程序里是用sql查询。弄个left join就好了。。。两个字段都是根据条件就能判断了。。。要是换成用hibernate的hql查询,这样就行不通了。。还是这么2张表。想用hql进行查询。。
select s.name1 from employee e left join s on e.sex=s.key and s.type='sys_gender'
name1就是s表里的性别的汉字表示


关联employee表的时候,是自动对应id的。然后通过id把其他多个字段都查上来。
hibernate映射好之后,自动生成sql语句,hibernate是自动通过id把其他字段查上来的,楼主就不用担心那些问题了。
楼主得补习下sql语句,做点sql语句的练习。
[其他解释]
正确的sql语句应该如下:
select s.name1 e.sex e.role from employee e left join s on e.id=s.key and s.type='sys_gender'
[其他解释]
引用:
正确的sql语句应该如下:
select s.name1 e.sex e.role from employee e left join s on e.id=s.key and s.type='sys_gender'


额。。我再想想吧。。谢谢你!
[其他解释]
引用:
正确的sql语句应该如下:
select s.name1 e.sex e.role from employee e left join s on e.id=s.key and s.type='sys_gender'


那是不是就得修改表了?
[其他解释]


引用:
正确的sql语句应该如下:
select s.name1 e.sex e.role from employee e left join s on e.id=s.key and s.type='sys_gender'




public class employee {
     private int id;
     private 权限 qx;//性别
     private 权限 qx;//权限
     //set、get方法
     //权限性别都在一个实体类里,2个字段都对应这一个实体类,就写重复了吧!
     //要是只写一个,那employee里就只是一个字段,又怎么区分是性别跟权限
}


热点排行