代码如下;
我有一个主题的实体ThemeBean.javaimport 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.   

    历史表:
    @ManyToOne(cascade=CascadeType.REFRESH,optional=false)
    @JoinColumn(name="THEME_ID")
    private ThemeBean themeBean主题表
    @OneToMany(cascade = CascadeType.ALL,mappedBy = "themeBean")
    private Set<ThemeBeanHistory> themeBeanHistorySet;这样就行了
      

  2.   


    主题表
    @OneToMany(cascade = CascadeType.ALL,mappedBy = "themeBean")
    private Set<ThemeBeanHistory> themeBeanHistorySet;删掉就可以了
      

  3.   

    因为我还有个逻辑是通过主题查看该主题的历史记录,所以在主题表做单向关联,去掉many方后,删除无法级联,只是把many方的外键update null,不做删除.插入是好的。外键也有我是去掉
    @ManyToOne(cascade=CascadeType.REFRESH,optional=false)
    @JoinColumn(name="THEME_ID")
    private ThemeBean themeBean然后再
    @OneToMany(cascade = CascadeType.ALL,mappedBy = "themeBean")
    加上了@JoinColumn(name="THEME_ID")这个
    private Set<ThemeBeanHistory> themeBeanHistorySet;
      

  4.   

    当然不能删除了,单向关联,多的一方如果没有one端的id,默认是为null的。
      

  5.   

    就是说双向关联才能删除?我现在这样映射还是删不了 @ManyToOne(cascade = {CascadeType.REFRESH,CascadeType.REMOVE},optional = false)
    @JoinColumn(name = "THEME_ID")
    private ThemeBean themeBean; @OneToMany(cascade = CascadeType.ALL,mappedBy = "themeBean")
    private Set<ThemeBeanHistory> themeBeanHistorySet;
      

  6.   

    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删除时候挂了
    后台就一句SQL:
    Hibernate: delete from MDM_THEME where THEME_ID=?
      

  7.   

    我查过了,要是先load一遍主题,然后再delete主题,就能级联删除了,但是必须放在一个事务里,我用的是spring的getHibernateTemplate去操作的,这样会出现2个session的问题
      

  8.   

    用的是spring的getHibernateTemplate去操作的,这个没使用过,还真不知道。