我的代码已经跑通了,但是有一点不太清楚:/*这是 地址实体类*/package my;public class address {
 private int id;
 private String address;
 private int userid;
 private user user; 
public user getUser() {
return user;
}
public void setUser(user user) {
this.user = user;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}}  /*这是用户的实体类*/package my;public class user {
 private int id;
 private String username;
 private java.util.Set addresses;
public java.util.Set getAddresses() {
return addresses;
}
public void setAddresses(java.util.Set addresses) {
this.addresses = addresses;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}/** default constructor */
public user() {
 }/** constructor with id */
public user(int id) {
    this.id = id;
 }}
 

/*这是用户的类的配置文件*/
<?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="my.user" table="user" 
    dynamic-update="true"
    dynamic-insert="true"   
  >
   <id name="id" type="integer" column="id" >
  <generator class="increment"/>
   </id>
    
  <property name="username" type="string" column="name">
  </property>
   <set name="addresses"
        inverse="true"
        table="address"
        cascade="all"
        order-by="id">
    <key column="userid"></key>    
    <one-to-many class="my.address"/>
   </set>
  </class>
 
</hibernate-mapping>/*这是地址类的配置文件*/
<?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="my.address" table="address"  
    dynamic-update="true"
    dynamic-insert="true"  >
    <id name="id" type="integer" column="id" >
    <generator class="increment"/>
    </id>
  <property name="address" type="string" column="address"/>
 
  <many-to-one name="user"
   class="my.user"
   cascade="none"
   outer-join="auto"
   update="true"
   insert="true"
   access="property"
   column="userid"
   not-null="true"
  />
 
  </class>
 
</hibernate-mapping>
        public static void main(String[] args) {
// TODO Auto-generated method stub
PropertyConfigurator.configure(myhibernatetest.class
               .getResource("log.properties"));
Configuration con=new Configuration().configure();
SessionFactory sessionfac=con.buildSessionFactory();
                Session session=con.buildSessionFactory().openSession();
                Transaction tran=session.beginTransaction();
      
        /*
         * 单向一对多
         *

        address ad=new address();
        address ad2=new address();
        address ad3=new address();
        user u= new user();
        u.setUsername("wwwww"); 
        ad.setAddress("DALIAN");
        ad2.setAddress("ddz");
        ad3.setAddress("ZHONGSHAN");
        HashSet se = new HashSet();
        se.add(ad);
        se.add(ad2);
        se.add(ad3);
        u.setAddresses(se);
        session.save(u);
        */
        
        
        /*双向一对多*/
         address ad=new address();
         address ad2=new address();
         user u= new user();
         u.setUsername("沟里人");
         ad.setAddress("站前街道");
         ad.setUser(u);
         ad2.setAddress("西山小区");
         ad2.setUser(u);
         
       ------------------------------
       \  HashSet set=new HashSet();\
       \  set.add(ad);              \
       \  set.add(ad2);             \
       \  u.setAddresses(set);      \
       ------------------------------   【此处改正後。请问这样写主控是由address 来完成的吗?主控方由哪方来完成如何体现出来的呢?不很清晰】
                                              由于是效仿资料,资料原来的写法:u.getAddresses().add(ad);
                                                                    u.getAddresses().add(ad2);
                                         会有如下的错误日志
                                      

解决方案 »

  1.   

    u.getAddresses().add(ad2); 
    你知道这句话什么意思么?
    是从数据库中获得你添加进去的ad2
    我从上面看不出你什么时候把ad2添加进去了
    要知道从session保存到数据库是要commit以后的事情
    一对多的话你只+一个也是可以的
    不过一般都推荐互相add下,因为关联吗他原来的写法要么本来数据库里面就有东西的吧
      

  2.   

    -------------------------------------------------------------------------------------------------------| 
                                                                                                                                                   DEBUG [main] (JDBCTransaction.java:54) - begin
    DEBUG [main] (ConnectionManager.java:415) - opening JDBC connection
    DEBUG [main] (DriverManagerConnectionProvider.java:93) - total checked-out connections: 0
    Exception in thread "main" java.lang.NullPointerException
    at my.myhibernatetest.main(myhibernatetest.java:60)
                                   //日志报错
    DEBUG [main] (DriverManagerConnectionProvider.java:99) - using pooled JDBC connection, pool size: 0
    DEBUG [main] (JDBCTransaction.java:59) - current autocommit status: false
    DEBUG [main] (JDBCContext.java:194) - after transaction begin
    ---------------------------------------------------------------------------------------------------------    
             session.save(u);
             tran.commit();
             session.close();
             sessionfac.close();}}
      

  3.   

    主控方就是你设置 了级联的那一方.你 address  的  cascade="none"  所以 address 肯顶不是主控方.