hibernate 插入

浏览作者的博客 浏览作者资料 最后更新: 2005-06-17 14:42    
浏览作者的博客 浏览作者资料
Good(0)    Bad_1(0) 
       时间: 2005-06-17 15:06        

现在又遇到了一个问题,是关于查询的:

我现在要在页面上显示所有的person信息,包括所属的公司名称,但是我查询时用了hql为:

代码
  1. select p,c.Name from Person as p,Company as c where p.company_id=c.id   
<script type="text/javascript">render_code();</script>

 

问题是我在页面上不知如何显示,查出来得到的list也无法转换到Person[]里去,不知道有什么方法可以解决。

company与person的关系是one-to-many 的关系。
company:

代码
  1. public class Company implements Serializable {   
  2.   
  3. /** identifier field */  
  4. private String id;   
  5.   
  6. /** nullable persistent field */  
  7. private String name;   
  8. private Set employees;   
  9.   
  10. /** full constructor */  
  11. public Company(java.lang.String name) {   
  12. this.name = name;   
  13. }   
  14.   
  15. /** default constructor */  
  16. public Company() {   
  17. }   
  18.   
  19. public java.lang.String getId() {   
  20. return this.id;   
  21. }   
  22.   
  23. public void setId(java.lang.String id) {   
  24. this.id = id;   
  25. }   
  26.   
  27. public java.lang.String getName() {   
  28. return this.name;   
  29. }   
  30.   
  31. public void setName(java.lang.String name) {   
  32. this.name = name;   
  33. }   
  34.   
  35. public void setEmployees(Set value) {   
  36. this.employees=value;   
  37. }   
  38. public Set getEmployees() {   
  39.   
  40. return employees;   
  41. }   
  42. public void addEmployee(hh.Person value) {   
  43. employees.add(value);   
  44. }   
  45. public void removeEmployee(hh.Person value) {   
  46. employees.remove(value);   
  47. }   
  48. public void clearEmployees() {   
  49. employees.clear();   
  50.   
  51. }   
  52. public String toString() {   
  53. return new ToStringBuilder(this)   
  54. .append("id", getId())   
  55. .toString();   
  56. }   
  57.   
  58. public boolean equals(Object other) {   
  59. if ( !(other instanceof Company) ) return false;   
  60. Company castOther = (Company) other;   
  61. return new EqualsBuilder()   
  62. .append(this.getId(), castOther.getId())   
  63. .isEquals();   
  64. }   
  65.   
  66. public int hashCode() {   
  67. return new HashCodeBuilder()   
  68. .append(getId())   
  69. .toHashCode();   
  70. }   
  71.   
  72. }   
<script type="text/javascript">render_code();</script>

 

person代码:

 

代码
  1. public class Person implements Serializable {   
  2.   
  3. /** identifier field */  
  4. private String id;   
  5.   
  6. /** nullable persistent field */  
  7. private String name;   
  8.   
  9. /** nullable persistent field */  
  10. private String address;   
  11.   
  12. /** nullable persistent field */  
  13. private String company_id;   
  14.   
  15. /** full constructor */  
  16. public Person(java.lang.String name, java.lang.String address, java.lang.String company_id) {   
  17. this.name = name;   
  18. this.address = address;   
  19. this.company_id = company_id;   
  20. }   
  21.   
  22. /** default constructor */  
  23. public Person() {   
  24. }   
  25.   
  26. public java.lang.String getId() {   
  27. return this.id;   
  28. }   
  29.   
  30. public void setId(java.lang.String id) {   
  31. this.id = id;   
  32. }   
  33.   
  34. public java.lang.String getName() {   
  35. return this.name;   
  36. }   
  37.   
  38. public void setName(java.lang.String name) {   
  39. this.name = name;   
  40. }   
  41.   
  42. public java.lang.String getAddress() {   
  43. return this.address;   
  44. }   
  45.   
  46. public void setAddress(java.lang.String address) {   
  47. this.address = address;   
  48. }   
  49.   
  50. public java.lang.String getCompany_id() {   
  51. return this.company_id;   
  52. }   
  53.   
  54. public void setCompany_id(java.lang.String companyId) {   
  55. this.company_id = companyId;   
  56. }   
  57.   
  58. public String toString() {   
  59. return new ToStringBuilder(this)   
  60. .append("id", getId())   
  61. .toString();   
  62. }   
  63.   
  64. public boolean equals(Object other) {   
  65. if ( !(other instanceof Person) ) return false;   
  66. Person castOther = (Person) other;   
  67. return new EqualsBuilder()   
  68. .append(this.getId(), castOther.getId())   
  69. .isEquals();   
  70. }   
  71.   
  72. public int hashCode() {   
  73. return new HashCodeBuilder()   
  74. .append(getId())   
  75. .toHashCode();   
  76. }   
  77.   
  78. }   
<script type="text/javascript">render_code();</script>

 

浏览作者的博客 浏览作者资料
Good(0)    Bad_1(0) 
       时间: 2005-06-17 15:37        

刚发现网上也有人问类似的问题,顺便把他引进来,我的问题和下面的差不多:

 

引用
1、项目现在用的是structs和hibernate构架,用eclipse开发。
2、问题出在两张表,一张a,有a.id和a.name属性,另一张b,有b.id, b.a.id和b.property属性(其他属性简略),现在a与b是一对多的关系,即一个a.id对应b中的多个记录。
3、根据系统现状,不合适物理上在数据库把两张表连接成一张表。
4、需要实现的是在前台页面列表显示如下信息:a.id, a.name, b.property1(对应同一个a.id的第一个property值) b.property2, b.property3 ……
4、在structs中,只要传递给前台jsp页面,a.list(a表的记录列表,但是有其特殊格式,比如<id>a.id</id>,同xml的记录格式),再调用iterate就可以自动一行一行显示。a.list的得到,通过from a即可。
5、现在想在同一行不仅显示a.id, a.name也要显示b.property1, b.property2。
6、现在想了一个方法,在后台把a和b做inner join,然后取相应值,再传递前台,但是使用如下语句select from a a.id, a.name, b.property inner join b where a.id = b.a.id出现两个问题,一、用query实现上面的语句,得到的是object对象,不能实现query.list(),这样类型不匹配,不能传给前台(就这个我到现在都没实现,怎么得到需要属性,按照要求的格式的list());二、就算得到了正确的list(),但是因为a.id对应多个b.property,所以对同一a.id来说,有多个记录,这样传到前台的时候,用iterate实现,不是有重复行了么?比如第一行a.1, b.property1,第二行a.2, b.property2,但是实际需要他们在一行显示(因为第一步都没实现,所以第二步更没有仔细考虑)。
7、在网上看见有select new ab(a.id, b.property) from a inner join b where a.id = b.a.id;就是根据inner join新建一张表,虽然可以不在数据库中出现物理表,但是还是要对应永久java类,而且还要在xml里面注册。尝试了一下,也有两个问题,同上。第一个就是通过query执行后,怎么让结果转化为list()返回;第二个还是多条记录的a.id的值重复。
8、我刚接触structs和hibernate不久,所以很多都不明白。请各位指教对以上问题的解决方法,一就是怎么通过hibernate操作数据库,取到希望取的值,而就是怎样利用structs本身的特点,简单实现页面的显示。比较急,因为下周一前就要实现了。在jsp前台中,使用list()传递,然后iterate实现,很方便,所以一直没有想数据显示一行读一次数据库,做一次表之间连接的老方法,似乎这样做的话,就违反了structs和hibernate构架封装、分离的初衷了。但是接触的时间太少,觉得这两个构架的限制太大,特别是hibernate,有一套繁琐的语法规则。应该有其他方式代替query的吧?

 

浏览作者的博客 浏览作者资料
Good(0)    Bad_1(0) 
       时间: 2005-06-20 09:59        

 

scienceren 写道
现在又遇到了一个问题,是关于查询的:

 

我现在要在页面上显示所有的person信息,包括所属的公司名称,但是我查询时用了hql为:

代码
  1. select p,c.Name from Person as p,Company as c where p.company_id=c.id   
<script type="text/javascript">render_code();</script>

 

问题是我在页面上不知如何显示,查出来得到的list也无法转换到Person[]里去,不知道有什么方法可以解决。

 

这时候不是Person[],而是Object[],Object[]中第一个元素为person对象,第二个是公司名(按照你的类定义,可能是字符串或者Name对象).

代码
  1. for(Iterator iter = query.list().iterate();iter.hasNext()){   
  2.     Object[] row = (Object[])iter.next();   
  3.     Person person = (Person)row[0];   
  4.     //假设是Name对象   
  5.     Name companyName = (Name)row[1];   
  6. }  
<script type="text/javascript">render_code();</script> 关于Hql你可以查查hibernate文档,这些都有详细说明.

 

浏览作者的博客 浏览作者资料
Good(0)    Bad_1(0) 
       时间: 2005-10-11 16:38        

 

snowway 写道
举例来说,比如有个Person类
scienceren 写道

第三个问题:同样地,能否用例子说明一下。

 

假如您有一个从数据库中得到person对象,该person.getName()为"abc"
那么:

代码
  1. Person person = (Person)session.get(Person.classnew Long(1));   
  2. //使person变成detached状态   
  3. session.evict(person);   
  4. //重新关联到session,使person变成persist状态   
  5. session.lock(person, LockMode.READ);   
  6. person.setName("abc");   
  7. session.update(person);  
<script type="text/javascript">render_code();</script>

 

将不会打印update语句,因为person的所有字段没有改变。那么hibernate如何探测您是否改变字段了呢?那是因为使用了session.lock后,hibernate会在内存中建立person对象的一份快照,当使用session.update后,hibernate会比较person和内存中的快照,用来判断实例属性有没有发生变化,只有发生了变化的字段才会出现在update语句中,本例没有任何属性变化,所以没有update语句产生。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值