User类:
package com.bryantd.hibernate.entity;import java.io.Serializable;
import java.util.*;import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;public class User implements Serializable {
private Integer id;
private String name;
private int age;private Set addresses;public User(String name, int age) {
super();
// TODO Auto-generated constructor stub
this.name = name;
this.age = age;
}public User(){}public Set getAddresses() {
if (addresses == null) {
return new HashSet();
}
return addresses;
}
public void setAddresses(Set addresses) {
this.addresses = addresses;
}public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}User的映射文件 user.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class 
name="com.bryantd.hibernate.entity.User"
table="undirectional_one_to_many_user">        <id name="id" type="java.lang.Integer">
            <column name="id" sql-type="INTEGER" not-null="true"/>
            <generator class="native"/>
        </id>        <property name="name" type="java.lang.String">
             <column name="name" sql-type="VARCHAR"/>
        </property><property name="age" type="int">
<column name="age" sql-type="INTEGER"/>
</property><!-- We usually set the class with the associated column as the domain class. -->
<set name="addresses" table="undirectional_one_to_many_address" cascade="all" inverse="true">
<key column="user_id"/>
<one-to-many class="com.bryantd.hibernate.entity.Address"/>
</set>
    </class></hibernate-mapping>Address类:
package com.bryantd.hibernate.entity;import java.io.Serializable;
import java.util.*;import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;public class Address implements Serializable {
private Integer id;
private String address;
private String telephone;private User user;public Address(String address, String telephone) {
super();
// TODO Auto-generated constructor stub
this.address = address;
this.telephone = telephone;
}public Address() {}public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}public boolean equals(Object object) {
if (!(object instanceof Address)) {
return false;
}
Address anotherAddress = (Address)object;
return new EqualsBuilder().appendSuper(super.equals(object))
                          .append(this.getAddress(), anotherAddress.getAddress())
                          .append(this.getTelephone(), anotherAddress.getTelephone())
                          .isEquals();
}public int hashCode() {
return new HashCodeBuilder().appendSuper(super.hashCode())
                            .append(this.getAddress())
                            .append(this.getTelephone())
                            .hashCode();
}/*
public boolean equals(Object object) {
// TODO Auto-generated method stub
if (onject == this) {
    return true;
}
if (object instanceof Address) {
Address address = (Address)object;
if (getAddress() == address.getAddress()) return true;
}
return false;
}public int hashCode() {
// TODO Auto-generated method stub
return getTelephone().hashCode() * getAddress().hashCode();
}
*/
}Address的映射文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class 
name="com.bryantd.hibernate.entity.Address"
table="undirectional_one_to_many_address">        <id name="id" type="java.lang.Integer">
            <column name="id" sql-type="INTEGER" not-null="true"/>
            <generator class="native"/>
        </id>        <property name="address" type="java.lang.String">
             <column name="address" sql-type="VARCHAR)"/>
        </property><property name="telephone" type="java.lang.String">
<column name="telephone" sql-type="VARCHAR"/>
</property><many-to-one name="user" class="com.bryantd.hibernate.entity.User" cascade="none"
column="user_id"
not-null="true"/>
    </class></hibernate-mapping>

解决方案 »

  1.   

    测试文件:
    package com.bryantd.hibernate.test;import com.bryantd.hibernate.entity.User;
    import com.bryantd.hibernate.entity.Address;import org.hibernate.cfg.Configuration;
    import org.hibernate.SessionFactory;
    import org.hibernate.Session;
    import org.hibernate.Query;
    import org.hibernate.Transaction;import java.util.*;public class UndirectionalOneToManyTest {
    public static void saveObject(Session session, Object savedObject) {
    Transaction transaction = session.beginTransaction();        session.save(savedObject);transaction.commit();
    }public static void updateObject(Session session, Object updatedObject) {
    Transaction transaction = session.beginTransaction();session.saveOrUpdate(updatedObject);transaction.commit();
    }public static void deleteObjects(Session session, String deletedObjectName) {
    Transaction transaction = session.beginTransaction();String hql = "delete " + deletedObjectName;
    Query query = session.createQuery(hql);
    query.executeUpdate();transaction.commit();
    }public static void showUsers(Session session) {
    Transaction transaction = session.beginTransaction();System.out.println("Show Users:");
    String hql = "from User";
    Query query = session.createQuery(hql);
    List list = query.list();
    Iterator userIterator = list.listIterator();
    while (userIterator.hasNext()) {
    User user = (User)userIterator.next();
    System.out.println(user.getName());Set addresses = user.getAddresses();
    Iterator addressIterator = addresses.iterator();
    while (addressIterator.hasNext()) {
    Address address = (Address)addressIterator.next();
    System.out.println(address.getAddress());
    }
    }
    System.out.println();transaction.commit();
    }public static void showAddresses(Session session) {
    Transaction transaction = session.beginTransaction();System.out.println("Show Addresses:");
    String hql = "from Address";
    Query query = session.createQuery(hql);
    List list = query.list();
    Iterator addressIterator = list.iterator();
    while (addressIterator.hasNext()) {
    Address address = (Address)addressIterator.next();
    System.out.println(address.getAddress());User user = address.getUser();
    if (user != null) {
    System.out.println(user.getName());
    }
    }
    System.out.println();transaction.commit();
    }public static void main(String[] args) {
    Configuration configuration = new Configuration().configure();
    SessionFactory sessionFactory = configuration.buildSessionFactory();
    Session session = sessionFactory.openSession();User user = new User("Bryantd", 23);
    Address address1 = new Address("address1", "111111");
    Address address2 = new Address("address2", "222222");address1.setUser(user);
    address2.setUser(user);deleteObjects(session, "User");
    deleteObjects(session, "Address");saveObject(session, user);
    saveObject(session, address1);
    saveObject(session, address2);user.getAddresses().add(address1);
    user.getAddresses().add(address2);updateObject(session, user);showUsers(session);
    showAddresses(session);
    }
    }
      

  2.   

    看书不认真!!!!
    不要用自己想的方式去认为它应该怎么怎么!!!
    你好好看看配置文件,你都没有理解那些属性,象什么cascade,inverse  ,而且每个属性的可选值代表的含义也是不一样的。
    它是完全可配置的,按照你的要求进行相关的处理,你可以在配置里解决,也可以在程序里面解决,都是可行的。你上面的做法就是配置是非关联的,在程序中进行关联。
      

  3.   

    个人作品,欢迎下载Hibernate固强,然用之稍烦.近常思于此而略有心得,故作此小东东以简化之.限予之技而难逃龌龊之举,望各大虾批评指正此套件虽然小,但是可以帮助你在实际项目中提高Hibernate的使用速度
    下载地址为<a href="http://www.cd-accp.net/web/hbdao.rar">http://www.cd-accp.net/web/hbdao.rar</a>此套件主要用于帮助开发人员在Hibernate环境下开发数据访问层
    为了使用此套件,你必须具备JDK1.5(或更高),并且设置你的编译器以支持5.0代码语法
    此套件提供以下功能 1.多Hibernate配置文件的支持
    2.可嵌套虚拟事务模型的支持
    3.事务边界拓展功能的支持
    4.事务隔离级别拓展功能的支持
    5.数据访问类事务处理自动注入的支持愿我的工作能减轻你的负担, 有问题可以反馈至[email protected], 祝使用愉快!
    (接下来的时间里,我将仔细研究.NET的System.Reflect.Emit名字空间以推出NHibernate版本)CSP提示
    自本年2月开始,本人开始利用非常宝贵的下班后的休息时间, 开发一套Java Web框架(CSP);目前取得阶段性成果, 不久的将来便可和大家碰面这套Java Web架构提供如下功能 1.服务端的非常像ASP.NET,提供基于视图控件的属性/事件编程模型
    2.服务端效防ASP.NET的__VIEWSTATE技术,实现页面的有状态化
    3.服务端效防ASP.NET1.1中的模板和数据绑顶功能,以及ASP.NET2.0中的母板功能
    4.服务端前台代码使用严格遵循Schema验证的XML书写,Schema验证结构可扩展.支持解析结果的缓冲和热加载功能
    5.客户端完全使用Ajax技术实现,所有的UI元素由Javascript动态生成
    6.客户端支持__VIEWSTATE隐藏字段信息的拆分和合并,在局部提交的情况下仍然配合全程的服务端工作
    7.客户端支持JavaScript文件的按需延迟下载,以达到下载的最小化如果不出意外.不久后此框架会发行面世,届时望四方朋友捧场如果有问题可以反馈到我的信箱[email protected], 谢谢你对本文挡的阅读
    陈涛,2006-10-17日于北大青鸟(成都名流)
      

  4.   

    超长的代码,实在没耐心看了..
    关于one-to-many的讨论很多,自己看看reference或者google下也好
      

  5.   

    很无聊的错误
    user.getAddresses().add(address1);
    user.getAddresses().add(address2); 
    在你的测试代码里面没有另外,session.delete()只是简单的转译hql到sql,不处理级联关系。