代码如下;
我有一个主题的实体ThemeBean.java

import java.io.Serializable;
import java.util.Date;
import java.util.Set;
import java.util.TreeSet;import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name = "THEME")
public class ThemeBean implements Serializable{

private static final long serialVersionUID = -4658290538342157675L;

@Id
@Column(name = "THEME_ID")
@SequenceGenerator(name = "SEQ_THEME_SEQ", sequenceName = "THEME_SEQUENCE", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_THEME_SEQ")
private Long id;

@Column(name = "THEME_NAME_EN")
private String themeNameEn;

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "THEME_ID")
private Set<ThemeBeanHistory> themeBeanHistorySet; public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getThemeNameEn() {
return themeNameEn;
} public void setThemeNameEn(String themeNameEn) {
this.themeNameEn = themeNameEn;
}
public Set<ThemeBeanHistory> getThemeBeanHistorySet() {
return themeBeanHistorySet;
} public void setThemeBeanHistorySet(Set<ThemeBeanHistory> themeBeanHistorySet) {
this.themeBeanHistorySet = themeBeanHistorySet;
}

public void addThemeHistory(ThemeBeanHistory themeHistory){
if(getThemeBeanHistorySet() == null){
setThemeBeanHistorySet(new TreeSet());
}
getThemeBeanHistorySet().add(themeHistory);
}
}

还有个主题历史的实体:
import java.io.Serializable;
import java.util.Date;import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;/**
 * 
 * 类说明:主题bean历史记录
 */
@Entity
@Table(name = "THEME_HISTORY")
public class ThemeBeanHistory implements Serializable{ private static final long serialVersionUID = -7707936885348490454L;

@Id
@Column(name = "ID")
@SequenceGenerator(name = "SEQ_THEME_HIS_SEQ", sequenceName = "THEME_HISTORY_SEQUENCE", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_THEME_HIS_SEQ")
private Long id;

@Column(name = "STATUS")
private String status;

@Column(name = "OPERATION_DATE")
private Date operationDate;

@Column(name = "MODIFIER_ID")
private Long modifierId;

@Column(name = "OPERATE_RESULT")
private Boolean operateResult; public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getStatus() {
return status;
} public void setStatus(String status) {
this.status = status;
} public Date getOperationDate() {
return operationDate;
} public void setOperationDate(Date operationDate) {
this.operationDate = operationDate;
} public Long getModifierId() {
return modifierId;
} public void setModifierId(Long modifierId) {
this.modifierId = modifierId;
} public Boolean getOperateResult() {
return operateResult;
} public void setOperateResult(Boolean operateResult) {
this.operateResult = operateResult;
}
}

我只做了one-to-many单向映射,插入主题的时候,历史表会新增一条记录,并且外键是有的,如果变成双向关联,新增的时候历史表的外键为null,我很不解,反复尝试后,发现只有在one端加joinColumn历史表的外键才不为null。现在的问题是,我要做one端删除的时候,多方只是将外键update为null.求解啊

解决方案 »

  1.   

    晕啊hibernate annotation实在弄的有点晕乎
      

  2.   

    数据库的设计就有问题
    外键应该在many端设啊
    在多方 配置 many-to-one就可以了一个主题对应多个历史记录。
    在历史记录里面设个外键指向主题就可以了
      

  3.   

    级联可以做到一方删除,外键变成null吗?
    这个是不是需要自己写代码来做............
    如果删除的是大量数据,那么还是直接用sql做吧...
      

  4.   

    谢谢你的回答,我尝试过这样,不知道是不是你的意思历史表:
    @ManyToOne
    @JoinColumn(name="THEME_ID")
    private ThemeBean themeBean主题表
    @OneToMany(cascade = CascadeType.ALL,mappedBy = "themeBean")
    private Set<ThemeBeanHistory> themeBeanHistorySet;
    这样配在新增主题的时候,历史表里的外键为null
      

  5.   

    我现在就是想删除一方的时候将多方也删除了,可以目前是将多方的外键置null,并不删除,郁闷啦...
      

  6.   

    在多方把标签改为
    @ManyToOne(cascade=CascadeType.REFRESH,optional=false)
      

  7.   

    7楼的正解,可是删除的时候是不是要先load一下,如果不load的话报错
     Could not execute JDBC batch update; SQL [delete from THEME where THEME_ID=?]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    如何不load的情况下删除呢
      

  8.   

    8楼,我的数据库应该没问题,发给你看看吧
    CREATE TABLE THEME_HISTORY
    (
      ID              NUMBER(10)                    NOT NULL,
      THEME_ID        NUMBER(10),
      STATUS          VARCHAR2(10 BYTE),
      OPERATION_DATE  TIMESTAMP(6),
      OPERATE_RESULT  VARCHAR2(10 BYTE),
      MODIFIER_ID     NUMBER(10)
    )
    TABLESPACE USERS
    PCTUSED    0
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                MINEXTENTS       1
                MAXEXTENTS       2147483645
                PCTINCREASE      0
                BUFFER_POOL      DEFAULT
               )
    LOGGING 
    NOCOMPRESS 
    NOCACHE
    NOPARALLEL
    MONITORING;COMMENT ON TABLE THEME_HISTORY IS '主题历史表';COMMENT ON COLUMN THEME_HISTORY.ID IS '主题历史表ID';COMMENT ON COLUMN THEME_HISTORY.THEME_ID IS '主题ID';COMMENT ON COLUMN THEME_HISTORY.STATUS IS '状态';COMMENT ON COLUMN THEME_HISTORY.OPERATION_DATE IS '操作时间';COMMENT ON COLUMN THEME_HISTORY.OPERATE_RESULT IS '操作结果';COMMENT ON COLUMN THEME_HISTORY.MODIFIER_ID IS '修改人ID';
    CREATE UNIQUE INDEX PK_THEME_HISTORY ON THEME_HISTORY
    (ID)
    LOGGING
    TABLESPACE USERS
    PCTFREE    10
    INITRANS   2
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                MINEXTENTS       1
                MAXEXTENTS       2147483645
                PCTINCREASE      0
                BUFFER_POOL      DEFAULT
               )
    NOPARALLEL;
    ALTER TABLE THEME_HISTORY ADD (
      CONSTRAINT PK_THEME_HISTORY
     PRIMARY KEY
     (ID)
        USING INDEX 
        TABLESPACE USERS
        PCTFREE    10
        INITRANS   2
        MAXTRANS   255
        STORAGE    (
                    INITIAL          64K
                    MINEXTENTS       1
                    MAXEXTENTS       2147483645
                    PCTINCREASE      0
                   ));
    ALTER TABLE THEME_HISTORY ADD (
      CONSTRAINT FKF3E058F544BA70AD 
     FOREIGN KEY (THEME_ID) 
     REFERENCES THEME (THEME_ID));
      

  9.   

    主题表
    CREATE TABLE MDM_THEME
    (
      THEME_ID         NUMBER(10)  NOT NULL,
      THEME_NAME_EN    VARCHAR2(50 BYTE),
    )
    TABLESPACE USERS
    PCTUSED    0
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                MINEXTENTS       1
                MAXEXTENTS       2147483645
                PCTINCREASE      0
                BUFFER_POOL      DEFAULT
               )
    LOGGING 
    NOCOMPRESS 
    NOCACHE
    NOPARALLEL
    MONITORING;COMMENT ON TABLE MDM_THEME IS '主题表';COMMENT ON COLUMN MDM_THEME.THEME_ID IS '主题ID';COMMENT ON COLUMN MDM_THEME.SYSTEM_ID IS '系统ID';COMMENT ON COLUMN MDM_THEME.THEME_NAME_EN IS '英文名称';CREATE UNIQUE INDEX PK_THEME ON THEME
    (THEME_ID)
    LOGGING
    TABLESPACE USERS
    PCTFREE    10
    INITRANS   2
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                MINEXTENTS       1
                MAXEXTENTS       2147483645
                PCTINCREASE      0
                BUFFER_POOL      DEFAULT
               )
    NOPARALLEL;
    ALTER TABLE THEME ADD (
      CONSTRAINT PK_THEME
     PRIMARY KEY
     (THEME_ID)
        USING INDEX 
        TABLESPACE USERS
        PCTFREE    10
        INITRANS   2
        MAXTRANS   255
        STORAGE    (
                    INITIAL          64K
                    MINEXTENTS       1
                    MAXEXTENTS       2147483645
                    PCTINCREASE      0
                   ));
      

  10.   

    把主题表
    @OneToMany 去掉 
    你再删除看下
      

  11.   

    不用从新load啊,你用的是什么技术连接的数据库。
      

  12.   

    历史表:
    配个ManyToOne主题表
    去掉OneToMany你操作试下撒
      

  13.   

    Oracle数据库
    用spring管理连接的
         <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@192.168.1.2:1521:XE" />
    <property name="username" value="zc" />
    <property name="password" value="zhangchun" />
    </bean>
      

  14.   

    sessionFactory和transaction是这样配的
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource">
         <ref bean="dataSource"/>
        </property>
        <property name="hibernateProperties">
           <props>
             <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
             <prop key="hibernate.show_sql">true</prop>
             <prop key="hibernate.connection.autocommit">true</prop>
             <prop key="hibernate.hbm2ddl.auto">update</prop>
           </props>
        </property>
      
        <property name="packagesToScan">
    <list>
    <value>com.aq.osgi.beans</value>
    </list>
        </property>
     </bean>
        
        <bean id="transactionManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
            <property name="sessionFactory" ref="sessionFactory" />  
        </bean> 
      

  15.   

    底层删除方法:
     protected void delete(Object object)
            throws CurrentlyException
        {
            try
            {
                this.getHibernateTemplate().delete(object);
            }
            catch (HibernateException he)
            {
                // 记录错误日志,抛出已定义异常
                CurrentlyException ce = new CurrentlyException(ErrorCodeConstant.ERROR_1001, he);
                log.error(he.getMessage());
                throw ce;
            }
        }
      

  16.   

    删除的时候还是报了 Could not execute JDBC batch update; SQL [delete from THEME where THEME_ID=?]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update而且我看了下hql,好像没有删历史表。直接去删主题表.
      

  17.   

    想不清的话就不要建关系,直接sql吧。一样的效果。