Java 冬眠赢了';t保存具有多通关系的实体
这是我的桌子:Java 冬眠赢了';t保存具有多通关系的实体,java,mysql,hibernate,Java,Mysql,Hibernate,这是我的桌子: CREATE TABLE `admin_log` ( `LOG_ID` bigint(20) NOT NULL AUTO_INCREMENT, `USER_ID` bigint(20) NOT NULL, `CREATION_DATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `ACTION` varchar(100) NOT NULL, `DETAILS` varchar(100) DEFAULT
CREATE TABLE `admin_log` (
`LOG_ID` bigint(20) NOT NULL AUTO_INCREMENT,
`USER_ID` bigint(20) NOT NULL,
`CREATION_DATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`ACTION` varchar(100) NOT NULL,
`DETAILS` varchar(100) DEFAULT NULL,
PRIMARY KEY (`LOG_ID`),
KEY `ADMIN_LOG_FK1` (`USER_ID`),
CONSTRAINT `ADMIN_LOG_FK1` FOREIGN KEY (`USER_ID`) REFERENCES `user_master` (`USER_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
以下是我的实体:
@Entity
@Table ( name = "admin_log" )
public class AdminLog {
private Long logId;
private UserMaster user;
...
@Id
@GeneratedValue ( strategy = IDENTITY )
@Column ( name = "LOG_ID", unique = true, nullable = false, length = 20 )
public Long getLogId () {
return logId;
}
public void setLogId ( Long logId ) {
this.logId = logId;
}
@ManyToOne
@JoinColumn ( name = "USER_ID" )
public UserMaster getUser () {
return user;
}
public void setUser ( UserMaster user ) {
this.user = user;
}
...
}
@Entity
@Table ( name = "user_master" )
public class UserMaster {
private Long userId;
...
@Id
@GeneratedValue ( strategy = IDENTITY )
@Column ( name = "USER_ID", unique = true, nullable = false, length = 20 )
public Long getUserId () {
return this.userId;
}
public void setUserId ( Long userId ) {
this.userId = userId;
}
...
}
当我尝试使用HibernateTemplate
中的save()
方法保存AdminLog
时,我收到以下错误:
SEVERE: Column 'USER_ID' cannot be null
org.springframework.dao.DataIntegrityViolationException: could not insert [...AdminLog];
SQL [insert into admin_log (ACTION, CREATION_DATE, DETAILS, USER_ID) values (?, ?, ?, ?)];
constraint [null] nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [...AdminLog]
问题是
userId
绝对不是空的!这就像Hibernate无法从AdminLog
中的user
属性中检索userId
。我做错了什么?您必须先持久化UserMaster
,然后才能持久化AdminLog您正试图保存UserMaster
的临时实例。如果您有对象的id
,则应首先加载该对象,并在保存之前将其设置为AdminLog
对象。在保存管理日志之前您的用户是否持久化?使用@ManyToOne(…cascade={CascadeType.PERSIST,CascadeType.MERGE})如果要在一个调用中同时执行这两个操作,能否在AdminLog中显示设置用户属性的测试代码或示例代码?您说UserMaster有一个id,这是因为您从hibernate中提取了UserMaster吗?