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

HIbernate关系映射,该如何处理

2013-01-25 
HIbernate关系映射Idcard.hbm.xml:!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping

HIbernate关系映射
Idcard.hbm.xml:


<!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.xyy.domain.Idcard">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="foreign">
                <param name="property">person</param>
            </generator>
        </id>
        <property name="validate" type="java.util.Date">
            <column name="validate"/>
        </property>
        <!-- 配置one-to-one
        constrained:不配置,则不会自动生成外键列,配置了,则会生成外键列
         -->
        <one-to-one name="person" constrained="true"/>
    </class>
</hibernate-mapping>


Person.hbm.xml:

<!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.xyy.domain.Person">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="assigned"/>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name"/>
        </property>
        <!-- 配置one-to-one -->
        <one-to-one name="idcard" />
    </class>
</hibernate-mapping>


TestMain.java:

            Person p1=new Person();
            p1.setId(2);
            p1.setName("scott1");
             
            Idcard idcard=new Idcard();
            idcard.setValidate(new Date());
            idcard.setPerson(p1);
             
            session.save(p1);
            session.save(idcard);




异常代码:
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
Caused by: java.sql.BatchUpdateException: ORA-00928: 缺失 SELECT 关键字
[最优解释]
引用:
<class name="com.xyy.domain.Idcard">
<class name="com.xyy.domain.Person">
都少了表名属性。

一对一映射默认使用cascade,可以不用显式配置。
一对一映射的外键很蛋疼……所以平常用多对一的特殊形式来进行关联。
采用<many-to-one>标签来映射,标签上设置unique属性,指定……

不用设置表名,会自动生成的。又给你上了一课。
[其他解释]
先看看数据库里面的表结构有木有问题啊
[其他解释]
貌似是插入的sql语句的问题。
引号,括号,字段名等问题,导致没正确识别sql语句。

映射的话,还是仔细检查一遍。
[其他解释]
楼主不妨可以先看下这里:

ORA-00928: 缺失 SELECT 关键字 
http://blog.csdn.net/fjun0910/article/details/6105224

共享主键方式实现一对一 
http://ryxxlong.iteye.com/blog/622652
[其他解释]

<!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.xyy.domain.Idcard"><!--这里怎么没有对用的数据库表名呢?-->
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="foreign">
                <param name="property">person</param>
            </generator>
        </id>
        <property name="validate" type="java.util.Date">
            <column name="validate"/>
        </property>
        <!-- 配置one-to-one
        constrained:不配置,则不会自动生成外键列,配置了,则会生成外键列
         -->
        <one-to-one name="person" constrained="true"/>
    </class>
</hibernate-mapping>

[其他解释]

<!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.xyy.domain.Idcard"><span style="color: #FF0000;">这里怎么没有对用的数据库表名呢?</span>
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="foreign">
                <param name="property">person</param>


            </generator>
        </id>
        <property name="validate" type="java.util.Date">
            <column name="validate"/>
        </property>
        <!-- 配置one-to-one
        constrained:不配置,则不会自动生成外键列,配置了,则会生成外键列
         -->
        <one-to-one name="person" constrained="true"/>
    </class>
</hibernate-mapping>


[其他解释]
one_to_one配置不正确,你再核对一下。
[其他解释]
<class name="com.xyy.domain.Idcard">
<class name="com.xyy.domain.Person">
都少了表名属性。

一对一映射默认使用cascade,可以不用显式配置。
一对一映射的外键很蛋疼……所以平常用多对一的特殊形式来进行关联。
采用<many-to-one>标签来映射,标签上设置unique属性,指定多的一端unique为true,这样就限制了多的一端的唯一。

两个表的主键内容不相同,但会有对应关系。
t_idCard
id      cardNo
100     1001
101     1002
t_person
id        name      idCard(unique)
1         张三       100
2         李四       101

配置范例:

<class name="com.project.hibernate.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
<class name="com.project.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<many-to-one name="person" unique="true"/>
</class>


Java例程:
储存例程:

IdCard idCard = new IdCard();
idCard.setCardNo("1001");
Person person = new Person();
person.setName("张三");
//建立关联
person.setIdCard(idCard);
//抛出TransientObjectException
//因为IdCard为Transient状态
session.save(person);

储存例程2:

IdCard idCard = new IdCard();
idCard.setCardNo("1001");
session.save(idCard);
Person person = new Person();
person.setName("张三");
//建立关联
person.setIdCard(idCard);
session.save(person);

读取例程:

Person person = (Person)session.load(Person.class, 2);
System.out.println("person.name=" + person.getName());
System.out.println("person.cardNo=" + person.getIdCard().getCardNo());


一对一映射只是为了双向一对一而存在的,平常都是用上面这种多对一的特殊形式的映射。
[其他解释]
楼主的问题真的很简单……就是没配置表名而已。
[其他解释]
引用:
one_to_one配置不正确,你再核对一下。


你把所有属性都改了,差很大的
------其他解决方案--------------------


引用:
引用:<class name="com.xyy.domain.Idcard">
<class name="com.xyy.domain.Person">
都少了表名属性。

一对一映射默认使用cascade,可以不用显式配置。
一对一映射的外键很蛋疼……所以平常用多对一的特殊形式来进行关联。
采用<many-to-one……


我知道会自动生成表名。
但这里,是他数据库有表名,但与生成的表名不符。所以才会报“缺失SELECT关键字”的异常。
[其他解释]
引用:
引用:引用:<class name="com.xyy.domain.Idcard">
<class name="com.xyy.domain.Person">
都少了表名属性。

一对一映射默认使用cascade,可以不用显式配置。
一对一映射的外键很蛋疼……所以平常用多对一的特殊形式来进……

数据库表可是映射文件自动创建的 !
[其他解释]
引用:
数据库表可是映射文件自动创建的 !


那是hibernate配置了如下配置才有的。
<!--自动根据hbm生成ddl。若表不存在,将创建表。不会删除原表。-->
<property name="hibernate.hbm2ddl.auto">update</property>
[其他解释]
引用:
数据库表可是映射文件自动创建的 !

请看这个链接的内容。
http://hi.baidu.com/luoting2762/item/0f180e9c8f1b22df1e4271b7

热点排行