代码如下;
我有一个主题的实体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.求解啊
我有一个主题的实体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.求解啊
解决方案 »
- 请大家看看这个问题,小弟急啊!myeclipse+tomcat在tomcat启动时的错误!
- JFreeChart 线图坐标值过大 显示不当问题
- 两个按钮提交到一个JSP页面,怎么判断?急
- 为了保护jsp源码,是把jsp文件放入web-inf目录里呢?还是有其它更好的方法呢?请指教
- asp网站!解决方案!大家帮我看看!回复给分!
- 怎么在web.xml或者server8080.xml中添加属性记录一个全局变量,然后在bean中调用?
- 有人么?有人做过大型网站的流量统计的东西么?
- 请看看这个问题是什么??
- 数据库访问出错,源码在此,大虾过目
- 求助一个思路的问题
- 这个setXmlResource fails: Connection reset是什么意思?
- poi 读取 word 报奇怪的错
外键应该在many端设啊
在多方 配置 many-to-one就可以了一个主题对应多个历史记录。
在历史记录里面设个外键指向主题就可以了
这个是不是需要自己写代码来做............
如果删除的是大量数据,那么还是直接用sql做吧...
@ManyToOne
@JoinColumn(name="THEME_ID")
private ThemeBean themeBean主题表
@OneToMany(cascade = CascadeType.ALL,mappedBy = "themeBean")
private Set<ThemeBeanHistory> themeBeanHistorySet;这样配在新增主题的时候,历史表里的外键为null
@ManyToOne(cascade=CascadeType.REFRESH,optional=false)
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的情况下删除呢
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));
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
));
@OneToMany 去掉
你再删除看下
配个ManyToOne主题表
去掉OneToMany你操作试下撒
用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>
<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>
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;
}
}