hibernate 注解设置外键?

双人鱼XKQ 发布于 2013/05/14 18:57
阅读 10K+
收藏 1

Menu.java


package com.xumuye.bean;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * 实体类
 * 
 * @author Administrator
 * 
 */
@Entity
@Table(name = "menu")
public class Menu {
	// 序号
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column
	private int mid;
	// 菜单名称
	@Column
	private String menuName;
	// 菜单的状态(0为删除)
	@Column
	private int status=1;
	// 打开的方式
	@Column
	private String target="_self";
	// 显示与否
	@Column
	private int display=1;

	public int getDisplay() {
		return display;
	}

	public void setDisplay(int display) {
		this.display = display;
	}

	public String getTarget() {
		return target;
	}

	public void setTarget(String target) {
		this.target = target;
	}

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}

	public int getMid() {
		return mid;
	}

	public void setMid(int mid) {
		this.mid = mid;
	}

	public String getMenuName() {
		return menuName;
	}

	public void setMenuName(String menuName) {
		this.menuName = menuName;
	}

}

SubMenu.java


package com.xumuye.bean;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * 实体类
 * 
 * @author Administrator
 * 
 */
@Entity
@Table(name = "submenu")
public class SubMenu {
	// 序号
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column
	private int id;
	// 菜单名称
	@Column
	private String menuName;
	// 菜单的状态(0为删除)
	@Column
	private int status=1;
	// 打开的方式
	@Column
	private String target="_self";
	// 显示与否
	@Column
	private int display=1;

	public int getDisplay() {
		return display;
	}

	public void setDisplay(int display) {
		this.display = display;
	}

	public String getTarget() {
		return target;
	}

	public void setTarget(String target) {
		this.target = target;
	}

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getMenuName() {
		return menuName;
	}

	public void setMenuName(String menuName) {
		this.menuName = menuName;
	}

}


如上述的两个实体类的代码,

如何注解,让Menu中mid成为SubMenu中的外键?

Menu为一级菜单,SubMenu为二级菜单。

Menu为一,相当于老师吧,SubMenu为多,相当于学生。

形如这样的:

想要达到的效果如下:


如果menu中有一条记录:

mid  menuName    status    display     target

1      网站首页         1          1            _self

SubMenu中就可以有多条记录对应menu中的主键的:

id      name

1       网站介绍

1       联系我们



可以这样写么?或者是别的思路?建立一个新的字段么?

挺着急的!谢谢!


加载中
1
jerry2012
jerry2012
在Menu创建Set<SubMenu>,然后@OneToMany,建议你不要把注解写在属性上,这样破坏了封装,而是写在getXXX()方法上。
双人鱼XKQ
双人鱼XKQ
下面的那个是我写的创建外界的方法,是可以创建的, 但是我在这个表中插入一条数据的时候,不知道怎么插入外键?
双人鱼XKQ
双人鱼XKQ
破坏了封装?什么意思?为什么会破坏?
1
jerry2012
jerry2012
原因是破坏了 Java 的封装的特性,因为属性都是 private 的,如果写在field上,hibernate可以直接访问类的私有的成员变量。把field设为private就是为了不让外界直接访问,而现在hibernate却可以直接访问,所以破坏了java的封装机制。
0
不是小白
不是小白

你可以在Menu中创建一个set<submenu>的字段,使用 onetomany 注解

还有,注解最好在 get 方法上,你现在的注解就破坏了封装。。。


双人鱼XKQ
双人鱼XKQ
嗯,谢谢你的回答!
不是小白
不是小白
回复 @追逐梦想 : 我下班了,先回去。。。
双人鱼XKQ
双人鱼XKQ
能帮我写出来么,谢谢!
0
不是小白
不是小白
当然,你反过来在Submenu里面创建 menu的字段,用 manytoone 注解也可以
0
不是小白
不是小白

多的一方:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="t_user")
public class User {
	private int id;
	private String name;
	private Group group;

	@ManyToOne
	@JoinColumn(name="groupId")
	public Group getGroup() {
		return group;
	}

	public void setGroup(Group group) {
		this.group = group;
	}

	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}
一的一方:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="t_group")
public class Group {
	private int id;
	private String name;

	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	

}

不是小白
不是小白
回复 @追逐梦想 : 这是?
双人鱼XKQ
双人鱼XKQ
@Override public void addMenu(Menu menu) { sessionFactory.getCurrentSession().save(menu); }
不是小白
不是小白
回复 @追逐梦想 : 封装一个menu的对象进来就行了
双人鱼XKQ
双人鱼XKQ
下面的那个是我写的创建外界的方法,是可以创建的, 但是我在这个表中插入一条数据的时候,不知道怎么插入外键?
不是小白
不是小白
回复 @追逐梦想 : 因为一个 group 可以有很多 user
下一页
0
双人鱼XKQ
双人鱼XKQ
package com.xumuye.bean;

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.Table;

/**
 * 实体类
 * 
 * @author Administrator
 * 
 */
@Entity
@Table(name = "submenu")
public class SubMenu {
	// 序号
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column
	private int subid;
	// 菜单名称
	@Column
	private String subMenuName;
	// 菜单的状态(0为删除)
	@Column
	private int subStatus = 1;
	// 打开的方式
	@Column
	private String subTarget = "_self";
	// 显示与否
	@Column
	private int subDisplay = 1;
	@ManyToOne(targetEntity = Menu.class)
	@JoinColumn(name = "menuId", referencedColumnName = "mid")
	private Menu menu;

	public Menu getMenu() {
		return menu;
	}

	public void setMenu(Menu menu) {
		this.menu = menu;
	}

	public int getSubid() {
		return subid;
	}

	public void setSubid(int subid) {
		this.subid = subid;
	}

	public String getSubMenuName() {
		return subMenuName;
	}

	public void setSubMenuName(String subMenuName) {
		this.subMenuName = subMenuName;
	}

	public int getSubStatus() {
		return subStatus;
	}

	public void setSubStatus(int subStatus) {
		this.subStatus = subStatus;
	}

	public String getSubTarget() {
		return subTarget;
	}

	public void setSubTarget(String subTarget) {
		this.subTarget = subTarget;
	}

	public int getSubDisplay() {
		return subDisplay;
	}

	public void setSubDisplay(int subDisplay) {
		this.subDisplay = subDisplay;
	}

	public SubMenu() {
		super();
		// TODO Auto-generated constructor stub
	}

	public SubMenu(int subid, String subMenuName, int subStatus,
			String subTarget, int subDisplay, int menuId) {
		super();
		this.subid = subid;
		this.subMenuName = subMenuName;
		this.subStatus = subStatus;
		this.subTarget = subTarget;
		this.subDisplay = subDisplay;
		this.menuId = menuId;
	}

}
返回顶部
顶部