开发者社区> 问答> 正文

一个类用时与两个类单向多对一无法保存?报错

用户、贴吧、帖子三个类

帖子和用户单向多对一

帖子和贴吧单向多对一

保存帖子时报错:


java.lang.reflect.InvocationTargetException
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

以下是源代码,为了避免太长,将构造方法等没用的东西删掉了:

/**
 * 帖子
 * 
 * @author 刘星鹭
 * @Email liuxinglumail@163.com
 * @version 创建时间: 2014年8月31日 下午7:43:00
 */
@Entity
@Table(name = "posts")
public class Post {
	private Integer postNo; // 帖子编号
	private String postTitle; // 帖子标题
	private String postContent; // 帖子内容
	private User postUser; // 帖子作者
	private Tieba postTieba; // 帖子所在贴吧

	/**
	 * 获得帖子号
	 * 
	 * @return 帖子号
	 */
	@Id
	@GeneratedValue
	public Integer getPostNo() {
		return postNo;
	}

	/**
	 * 设置帖子号
	 * 
	 * @param postNo
	 *            帖子号
	 */
	public void setPostNo(Integer postNo) {
		this.postNo = postNo;
	}

	/**
	 * 获得帖子标题
	 * 
	 * @return 帖子标题
	 */
	@Column(length = 20, nullable = false)
	public String getPostTitle() {
		return postTitle;
	}

	/**
	 * 设置帖子标题
	 * 
	 * @param postTitle
	 *            帖子标题
	 */
	public void setPostTitle(String postTitle) {
		this.postTitle = postTitle;
	}

	/**
	 * 获得帖子内容
	 * 
	 * @return 帖子内容
	 */
	@Lob
	@Column(nullable = false)
	public String getPostContent() {
		return postContent;
	}

	/**
	 * 设置帖子内容
	 * 
	 * @param postContent
	 *            帖子内容
	 */
	public void setPostContent(String postContent) {
		this.postContent = postContent;
	}

	/**
	 * 获得帖子作者
	 * 
	 * @return 帖子作者
	 */
	@ManyToOne(cascade = {CascadeType.REFRESH,CascadeType.MERGE,CascadeType.PERSIST}, fetch = FetchType.EAGER // 只要是@xxxOne默认fetchType是eager
	, optional = false // 代表这个对象是不是可有可无的
	)
	@JoinColumn(name = "user_name")
	// 指定外键的名称
	public User getPostUser() {
		return postUser;
	}

	/**
	 * 设置帖子作者
	 * 
	 * @param postUser
	 *            帖子作者
	 */
	public void setPostUser(User postUser) {
		this.postUser = postUser;
	}

	/**
	 * 获得帖子所在贴吧
	 * 
	 * @return 帖子所在贴吧
	 */
	@ManyToOne(cascade = {CascadeType.REFRESH,CascadeType.MERGE,CascadeType.PERSIST}, fetch = FetchType.EAGER // 只要是@xxxOne默认fetchType是eager
	, optional = false // 代表这个对象是不是可有可无的
	)
	@JoinColumn(name = "tieba_name")
	// 指定外键的名称
	public Tieba getPostTieba() {
		return postTieba;
	}

	/**
	 * 设置帖子所在贴吧
	 * 
	 * @param postTieba
	 *            帖子所在贴吧
	 */
	public void setPostTieba(Tieba postTieba) {
		this.postTieba = postTieba;
	}
}


/**
 * 用户
 * 
 * @author 刘星鹭
 * @Email liuxinglumail@163.com
 * @version 创建时间: 2014年8月31日 下午6:35:16
 */
@Entity
@Table(name = "users")
public class User {
	private String userName; // 用户名
	private String userPassword; // 用户密码
	private String userSex; // 用户性别
	private java.util.Date userBirthday; // 用户生日
	private Set<Tieba> favourateTiebas = new HashSet<Tieba>(); // 用户喜欢的贴吧
	//private Set<Post> thisUsersPosts = new HashSet<Post>(); // 用户发布的帖子

	/**
	 * 获得用户名
	 * 
	 * @return 用户名
	 */
	@Id
	// 主键
	@Column(length = 20, nullable = false)
	// 字段长度为20,不可为空
	public String getUserName() { // 以下均为Getter和Setter
		return userName;
	}

	/**
	 * 设置用户名
	 * 
	 * @param userName
	 *            用户名
	 */
	public void setUserName(String userName) {
		this.userName = userName;
	}

	/**
	 * 获得用户密码
	 * 
	 * @return 用户密码
	 */
	@Column(length = 20, nullable = false)
	// 字段长度为20,不可为空
	public String getUserPassword() {
		return userPassword;
	}

	/**
	 * 设置用户密码
	 * 
	 * @param userPassword
	 *            用户密码
	 */
	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}

	/**
	 * 获得用户性别
	 * 
	 * @return 用户性别
	 */
	@Column(length = 5, nullable = false)
	// 字段长度为20,不可为空
	public String getUserSex() {
		return userSex;
	}

	/**
	 * 设置用户性别
	 * 
	 * @param userSex
	 *            用户性别
	 */
	public void setUserSex(String userSex) {
		this.userSex = userSex;
	}

	/**
	 * 获得用户生日
	 * 
	 * @return 用户生日
	 */
	@Temporal(TemporalType.DATE)
	// 日期类型为DATE
	@Column(nullable = false)
	// 字段不可为空
	public java.util.Date getUserBirthday() {
		return userBirthday;
	}

	/**
	 * 设置用户生日
	 * 
	 * @param userBirthday
	 *            用户生日
	 */
	public void setUserBirthday(java.util.Date userBirthday) {
		this.userBirthday = userBirthday;
	}

	/**
	 * 获得该用户关注的贴吧
	 * 
	 * @return 该用户关注的贴吧
	 */
	@ManyToMany(cascade = {CascadeType.REFRESH,CascadeType.MERGE})
	@JoinTable(name = "user_tieba", inverseJoinColumns = @JoinColumn(name = "tieba_name") // 可以理解为“跟被维护端的外键的定义”
	, joinColumns = @JoinColumn(name = "user_name"))
	// 注意这个name是没有提示的
	public Set<Tieba> getFavourateTiebas() {
		return favourateTiebas;
	}

	/**
	 * 设置该用户关注的贴吧
	 * 
	 * @param favourateTiebas
	 *            该用户关注的贴吧
	 */
	public void setFavourateTiebas(Set<Tieba> favourateTiebas) {
		this.favourateTiebas = favourateTiebas;
	}
}
/**
 * 贴吧
 * 
 * @author 刘星鹭
 * @Email liuxinglumail@163.com
 * @version 创建时间: 2014年8月31日 下午7:08:06
 */

@Entity
@Table(name = "tiebas")
public class Tieba {
	private String tiebaName;// 贴吧名
	private boolean deleted = false;// 是否被删除(不在数据库中显示)
	private Set<User> thisTiebasUsers = new HashSet<User>(); // 本贴吧的用户
	//private Set<Post> thisTiebasPosts = new HashSet<Post>(); // 本贴吧的帖子

	/**
	 * 获得贴吧名
	 * 
	 * @return 贴吧名
	 */
	@Id
	// 主键
	@Column(length = 20, nullable = false)
	// 字段长度为20,不可为空
	public String getTiebaName() { // 以下均为Getter和Setter
		return tiebaName;
	}

	/**
	 * 设置贴吧名
	 * 
	 * @param tiebaName
	 *            贴吧名
	 */
	public void setTiebaName(String tiebaName) {
		this.tiebaName = tiebaName;
	}

	/**
	 * 获得该贴吧所有用户
	 * 
	 * @return 该贴吧所有用户
	 */
	@ManyToMany(cascade = {CascadeType.REFRESH,CascadeType.MERGE} // 笔记:级联删除基本用不到
	, mappedBy = "favourateTiebas")
	public Set<User> getThisTiebasUsers() {
		return thisTiebasUsers;
	}

	/**
	 * 设置该贴吧所有用户
	 * 
	 * @param thisTiebasUsers
	 *            该贴吧所有用户
	 */
	public void setThisTiebasUsers(Set<User> thisTiebasUsers) {
		this.thisTiebasUsers = thisTiebasUsers;
	}

	/**
	 * 判断该贴吧是否被删除
	 * 
	 * @return 该贴吧是否被删除
	 */
	@Transient
	public boolean isDeleted() {
		return deleted;
	}

	/**
	 * 设置该贴吧是否被删除
	 * 
	 * @param deleted
	 *            该贴吧是否被删除
	 */
	public void setDeleted(boolean deleted) {
		this.deleted = deleted;
	}
}



/**
 * 帖子_添加帖子Action
 * 
 * @author 刘星鹭
 * @Email liuxinglumail@163.com
 * @version 创建时间: 2014年9月9日 下午4:55:15
 */
@Controller
@Transactional
public class AddPostAction {@Resource
 PostService postService;// 注入帖子Service
 @Resource
 UserService userService;// 注入用户Service

	@Resource
	PostService postService;// 注入帖子Service
	private String userName;//用户名
	private String tiebaName;//贴吧名
	private String postTitle;//帖子标题
	private String postContent;//帖子内容

	/**
	 * 调用本Action时执行本方法
	 * 
	 * @return 用于Action判断跳转方向的字符串
	 */
	public String execute() {
		User user=userService.find(userName);//底层调用的是session.get
		Tieba tieba=tiebaService.find(tiebaName);//底层调用的是session.get
		Post post=new Post(postTitle, postContent, user, tieba);
		postService.add(post);//底层调用的是session.persist
		return "success";
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getTiebaName() {
		return tiebaName;
	}

	public void setTiebaName(String tiebaName) {
		this.tiebaName = tiebaName;
	}

	public String getPostTitle() {
		return postTitle;
	}

	public void setPostTitle(String postTitle) {
		this.postTitle = postTitle;
	}

	public String getPostContent() {
		return postContent;
	}

	public void setPostContent(String postContent) {
		this.postContent = postContent;
	}	
}



请问哪里出错了呀!!!


展开
收起
爱吃鱼的程序员 2020-06-14 17:26:37 479 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    代码还是很长,只贴出主键和关联关系就够了,异常信息要多一点把报错信息全部黏贴出来吧<divclass='ref'>

    引用来自“JeffreyLin”的评论

    代码还是很长,只贴出主键和关联关系就够了,异常信息要多一点<divclass='ref'>

    引用来自“贵”的评论

    把报错信息全部黏贴出来吧

    2020-06-14 17:26:52
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载