org.hibernate.id.IdentifierGenerationException: null id generated for:class com.liujinlong.entity.Address1测试代码如下 请指教 
          表中已经两端设置了主键 用户端主键自动增长1  public static void main(String[] args) {
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction(); try {
Person1 p = new Person1();
Address1 ad = new Address1();

ad.setAtext("北京");
p.setPname("张三");

ad.setPerson1(p);
p.setAddress1(ad);



session.save(p);
tx.commit();
System.out.println("ok");
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
} }--------------------------------------
用户类
public class Person1 implements java.io.Serializable { // Fields private Integer pid; private String pname; private Address1 address1;
        ............地址类
public class Address1 implements java.io.Serializable { private Integer aid; private String atext; private Person1 person1;        ...........
-----------------------------------------------用户端配置
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.liujinlong.entity.Person1" table="Person1"
schema="dbo" catalog="accpOnetoOne">

<id name="pid" type="java.lang.Integer">
<column name="pid" />
<generator class="native" />
</id>

<property name="pname" type="java.lang.String">
<column name="pname" length="50" not-null="true" />
</property>
<one-to-one name="address1"
class="com.liujinlong.entity.Address1"  cascade="all" constrained="true"
>
</one-to-one
>
</class>
</hibernate-mapping>-----------------------------------
地址端配置
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.liujinlong.entity.Address1" table="Address1" schema="dbo" catalog="accpOnetoOne">
        <id name="aid" type="java.lang.Integer">
            <column name="aid" />
            <generator class="foreign" >
            <param name="property">person1</param>
            </generator>
        </id>
        <property name="atext" type="java.lang.String">
            <column name="atext" length="50" />
        </property>
        <one-to-one name="person1" class="com.liujinlong.entity.Person1"></one-to-one>    </class>
</hibernate-mapping>
------------------------
org.hibernate.id.IdentifierGenerationException: null id generated for:class com.liujinlong.entity.Address1测试代码如下 请指教 
          表中已经两端设置了主键 用户端主键自动增长1  public static void main(String[] args) {
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction(); try {
Person1 p = new Person1();
Address1 ad = new Address1();

ad.setAtext("北京");
p.setPname("张三");

ad.setPerson1(p);
p.setAddress1(ad);



session.save(p);
tx.commit();
System.out.println("ok");
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
} }

解决方案 »

  1.   

    null id generated for:class com.liujinlong.entity.Address1 <id name="aid" type="java.lang.Integer"> 
                <column name="aid" /> 
                <generator class="foreign" > 
                <param name="property">person1 </param> 
                </generator> 
    </id>     
    会不会是Address1 的主健生成策略有问题..
      

  2.   

    你写的配置文件有问题
    1.一对一配置方式有两种,你采用的是共享主键的方式。
      不知道想用哪个类为主控方,你写的Address类为主类,但配置恰好写反了。
      正确的方式(以Person为主类,Address为副类,就是地址类的id与Person的id相同)
        Person:
        <id ..>
          <genernator class="increment"/>
        </id>
        ...
        <one-to-one name="address" class="包名.Address"/>
       
       Address
        <id ..>
           <generator class="foreign">
              <param name="property">person</param> 
          </...>
          <one-to-one name="person" constrined="true"/>