是。
hibernate可以使用工具根据你的数据库生成映射。或则你手动生成。

解决方案 »

  1.   

    我在做一对一外键关联时
    使用两张表,一张Student,一张CardStudent表
    id           varchar       5 (PK)
    name         varchar       20
    card_id      varchar       8
    sex          char          2
    age          int           3Card表
    id           varchar        8(PK)
    name         varchar        20
    Student.hbm.xml<hibernate-mapping>
        <class name="dataAssign.Student" table="Student" catalog="study">
            <id name="id" type="java.lang.String">
                <column name="id" />
                <generator class="native" />
            </id>
            <property name="name" type="java.lang.String">
                <column name="name" length="20" not-null="true" />
            </property>
            <property name="sex" type="java.lang.String">
                <column name="sex" length="2" not-null="true" />
            </property>
            <property name="age" type="java.lang.Integer">
                <column name="age" not-null="true" />
            </property>
            <many-to-one name="card" class="dataAssign.Card" column="card_id" unique="true" lazy="false"/>
        </class>
    </hibernate-mapping>
    Card.hbm.xml<hibernate-mapping>
        <class name="dataAssign.Card" table="Card" catalog="study">
            <id name="id" type="java.lang.String">
                <column name="id" />
                <generator class="native"/>
                
            </id>
            <property name="name" type="java.lang.String">
                <column name="name" length="20" not-null="true" />
            </property>
         <one-to-one name="stu" class="DataAssign.Student" cascade="all"/>   
        </class>
    </hibernate-mapping>
    SCDemo.java(测试文件)package dataAssign;
    import dataAssign.*;
    import org.hibernate.*;
    public class SCDemo {
    public static  void main(String args[]){
    Student stu=new Student();
    stu.setId("23");
    stu.setName("Bill");
    stu.setCardId("20051215");
    stu.setSex("男");
    stu.setAge(22);
    System.out.println("sex is:"+stu.getSex());
    Card card=new Card();
    card.setName("Bill");

    stu.setCard(card);
    card.setStu(stu);
    Session session=HibernateSessionFactory.getSession();
    Transaction tx=session.beginTransaction();
    StudentDAO studao=new StudentDAO();
    try{
    studao.save(stu);
    tx.commit();
    session.close();
    System.out.println("name is:"+stu.getName());
    }
    catch(HibernateException e){
    e.printStackTrace();
    tx.rollback();
    }
    }
    }运行后报错%%%% Error Creating SessionFactory %%%%
    org.hibernate.MappingException: persistent class not known: DataAssign.Student
    at org.hibernate.cfg.Configuration$1.getIdentifierType(Configuration.java:1917)
    at org.hibernate.type.EntityType.getIdentifierType(EntityType.java:226)
    at org.hibernate.type.EntityType.getIdentifierOrUniqueKeyType(EntityType.java:236)
    at org.hibernate.persister.entity.AbstractPropertyMapping.initIdentifierPropertyPaths(AbstractPropertyMapping.java:171)
    at org.hibernate.persister.entity.AbstractPropertyMapping.initPropertyPaths(AbstractPropertyMapping.java:160)
    at org.hibernate.persister.entity.AbstractEntityPersister.initOrdinaryPropertyPaths(AbstractEntityPersister.java:1585)
    at org.hibernate.persister.entity.AbstractEntityPersister.initPropertyPaths(AbstractEntityPersister.java:1613)
    at org.hibernate.persister.entity.AbstractEntityPersister.postConstruct(AbstractEntityPersister.java:2610)
    at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:386)
    at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:216)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1176)
    at dataAssign.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:60)
    at dataAssign.HibernateSessionFactory.getSession(HibernateSessionFactory.java:43)
    at dataAssign.SCDemo.main(SCDemo.java:18)
    Exception in thread "main" java.lang.NullPointerException
    at dataAssign.SCDemo.main(SCDemo.java:19)
      

  2.   

     DataAssign.Student -->  dataAssign.Student
    大小写问题而已
      

  3.   

    DataAssign.Student   -->     dataAssign.Student 
    这个是我调试时弄错的
    现在改回来了
    但是,还是出错org.hibernate.TransientObjectException: dataAssign.Card
    at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:216)
    at org.hibernate.type.EntityType.getIdentifier(EntityType.java:108)
    at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:221)
    at org.hibernate.type.TypeFactory.findDirty(TypeFactory.java:476)
    at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:2803)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:467)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:190)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:113)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:195)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at dataAssign.SCDemo.main(SCDemo.java:24)

    是否是我的配置有问题??
    麻烦了~~~~
      

  4.   

    <one-to-one name="stu" class="DataAssign.Student" cascade="all"/>   
      

  5.   

    楼上的 peacockbird 
    是什么意思呢??
      

  6.   

    > 是否在数据库中要先设置外键?
    推荐否。
    你现在的问题就是进行dataAssign.Card时事务出错。因为关联外键为保存。也就是所在存的时候你的关联实体并没有先存如数据库。所以造成数据库中的主外键约束不匹配。ls加cascade的意思是将级联关系在ORM中体现。这样hibernate会先根据级联关系保存外键实体。
    org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved
    另,数据库中最好不要设置主外键约束,若后期进行系统结构修改,你会很痛苦。因为这样造成关系实体间的强耦。
      

  7.   

    我们老师推荐不要建立外键关系。也就是说可以逻辑上存在主外键关系,但是数据库中可以不要建立这个关系。并且我也尝试了,在Hibernate中我将数据库中的外键关系去除之后,删除主键数据,一样的将外键中的所有数据删除了。