Oracle 9i,使用hibernate,多对多的关系映射,级联操作的时候,出错了. 
我的数据库中表的主键是采用自增长的方式,序列+触发器进行的自增长. 
实体类与表的映射文件,如下 
<?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"> 
<hibernate-mapping> 
<class name="entity.Favorite" table="favorite1"> 
<id name="fid" type="int"> 
<column name="fid"></column> 
<generator class="sequence"> 
<param name="sequence">F1</param> 
</generator> 
</id> 
<property name="fname" type="java.lang.String"></property> 
<property name="furi" type="java.lang.String"></property> 
<property name="fdesc" type="java.lang.String"></property> 
<bag name="taglist" table="reflect1" inverse="true" cascade="all"> 
<key column="rfid"></key> 
<many-to-many class="entity.Tag" column="rtname" ></many-to-many> 
</bag> 
</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"> 
<hibernate-mapping> 
<class name="entity.Tag" table="tag1"> 
<id name="tname" type="java.lang.String"> 
<column name="tname"></column> 
<generator class="assigned"></generator> 
</id> 
<bag name="fs" table="reflect1" > 
<key column="rtname"></key> 
<many-to-many class="entity.Favorite" column="rfid" ></many-to-many> 
</bag> 
</class> 
</hibernate-mapping> 
---------------------------------------------------- 
JAVA代码 
Configuration c=new Configuration().configure(); 
SessionFactory sf=c.buildSessionFactory(); 
Session s=sf.openSession(); 
s.beginTransaction(); 
Favorite fav=new Favorite(); 
fav.setFdesc("asdf"); 
fav.setFname("sina"); 
fav.setFuri("www.sina.com"); 
Tag tag1=new Tag(); 
tag1.setTname("news"); 
tag1.getFs().add(fav); 
fav.getTaglist().add(tag1); 
s.save(fav); 
s.getTransaction().commit(); 
s.close(); 
---------------------------------------------------- 
错误提示: 
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94) 
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114) 
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109) 
at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2242) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2678) 
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79) 
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167) 
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028) 
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366) 
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) 
at entity.Tt.main(Tt.java:28) 
Caused by: java.sql.BatchUpdateException: ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C003139) at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:459) 
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:3907) 
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
... 15 more 

解决方案 »

  1.   

    呵呵如果是UPDATE的话!hibernate更新需要根据ID来进行!至于为什么SAVE变成了UPDATE是因为配置错误!你把这里<column name="fid"></column>  
    <generator class="sequence">  
    <param name="sequence">F1</param>  
    </generator>  
    </id>  
    改成另一种方式native或者increment
      

  2.   

    回复 1楼:increment,已经试过不行,native更加不可能啦,Oracle不支持native;
    回复 2楼:F1是序列sequence,数据为中定义的
    头疼死我了 这问题 ... ???   
      

  3.   

    补充一下表结构,如下是我的表结构: 
    --------------------------------- 
    SQL> desc reflect; 
    Name   Type         Nullable Default Comments 
    ------ ------------ -------- ------- -------- 
    RFID   NUMBER       Y                         
    RTNAME VARCHAR2(20) Y                         SQL> desc favorite; 
    Name  Type         Nullable Default Comments 
    ----- ------------ -------- ------- -------- 
    FID   NUMBER                                 
    FNAME VARCHAR2(20)                           
    FURI  VARCHAR2(20)                           
    FDESC VARCHAR2(20) Y                         SQL> desc tag; 
    Name  Type         Nullable Default Comments 
    ----- ------------ -------- ------- -------- 
    TNAME VARCHAR2(20) 
      

  4.   

    oracle支持native!
      你的问题是tag1.getFs().add(fav);  
    fav.getTaglist().add(tag1);  
    s.save(fav);  
    这段写错了!你测试下就会发现问题
      

  5.   

    多对多保存时两边的对象都要保存。
    你这需要添加s.save(tag1);