Hibernate集合属性的元素为组件(三)

对于集合元素是组合属性,程序依然使用@ElementCollection修饰集合属性,使用@CollectionTable映射保存集合属性的表。对于带索引的集合,如果是List集合,则使用@OrderColumn映射索引列;如果Map集合,则使用@MapKeyColumn映射索引列。下面是Person类代码:

@Entity
@Table(name="person_inf")
public class Person
{
	@Id @Column(name="person_id")
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	private int age;
	// Map集合元素是组件
	@ElementCollection(targetClass=Score.class)
	@CollectionTable(name="score_inf",
		joinColumns=@JoinColumn(name="person_id" , nullable=false))
	@MapKeyColumn(name="subject_name")
	@MapKeyClass(String.class)
	private Map<String , Score> scores
		= new HashMap<>();
	// List集合元素是组件
	@ElementCollection(targetClass=Name.class)
	@CollectionTable(name="nick_inf",
		joinColumns=@JoinColumn(name="person_id" , nullable=false))
	@OrderColumn(name="list_order")
	private List<Name> nicks
		= new ArrayList<>();

	// id的setter和getter方法
	public void setId(Integer id)
	{
		this.id = id;
	}
	public Integer getId()
	{
		return this.id;
	}

	// age的setter和getter方法
	public void setAge(int age)
	{
		this.age = age;
	}
	public int getAge()
	{
		return this.age;
	}

	// nicks的setter和getter方法
	public void setNicks(List<Name> nicks)
	{
		this.nicks = nicks;
	}
	public List<Name> getNicks()
	{
		return this.nicks;
	}

	// scores的setter和getter方法
	public void setScores(Map<String , Score> scores)
	{
		this.scores = scores;
	}
	public Map<String , Score> getScores()
	{
		return this.scores;
	}
}

下面是Name的类

@Embeddable
public class Name
{
	// 定义first成员变量
	@Column(name="person_firstname")
	private String first;
	// 定义last成员变量
	@Column(name="person_lastname")
	private String last;
	// 引用拥有该Name的Person对象
	@Parent
	private Person owner;

	// 无参数的构造器
	public Name()
	{
	}
	// 初始化全部成员变量的构造器
	public Name(String first , String last)
	{
		this.first = first;
		this.last = last;
	}

	// first的setter和getter方法
	public void setFirst(String first)
	{
		this.first = first;
	}
	public String getFirst()
	{
		return this.first;
	}

	// last的setter和getter方法
	public void setLast(String last)
	{
		this.last = last;
	}
	public String getLast()
	{
		return this.last;
	}

	// owner的setter和getter方法
	public void setOwner(Person owner)
	{
		this.owner = owner;
	}
	public Person getOwner()
	{
		return this.owner;
	}

}

下面是Score类

@Embeddable
public class Score
{
	// 定义first成员变量
	@Column(name="score_level")
	private String level;
	// 定义last成员变量
	@Column(name="score_mark")
	private Integer mark;
	// 引用拥有该Name的Person对象
	@Parent
	private Person owner;

	// 无参数的构造器
	public Score()
	{
	}
	// 初始化全部成员变量的构造器
	public Score(String level , Integer mark)
	{
		this.level = level;
		this.mark = mark;
	}

	// level的setter和getter方法
	public void setLevel(String level)
	{
		this.level = level;
	}
	public String getLevel()
	{
		return this.level;
	}

	// mark的setter和getter方法
	public void setMark(Integer mark)
	{
		this.mark = mark;
	}
	public Integer getMark()
	{
		return this.mark;
	}

	// owner的setter和getter方法
	public void setOwner(Person owner)
	{
		this.owner = owner;
	}
	public Person getOwner()
	{
		return this.owner;
	}

}

执行程序如下:

public class PersonManager
{
	public static void main(String[] args)
	{
		PersonManager mgr = new PersonManager();
		mgr.createAndStorePerson();
		HibernateUtil.sessionFactory.close();
	}
	private void createAndStorePerson()
	{
		Session session = HibernateUtil.currentSession();
		Transaction tx = session.beginTransaction();
		// 创建Person对象
		Person person = new Person();
		//为Person对象设置属性
		person.setAge(29);
		//创建一个Map集合
		Map<String , Name> nicks =
			new HashMap<String , Name>();
		// 向List集合里放入Name对象
		person.getNicks().add(new Name("Wawa" , "Wawa"));
		person.getNicks().add(new Name("Yeeku" , "Lee"));
		// 向List集合里放入Score对象
		person.getScores().put("语文" , new Score("良好" , 85));
		person.getScores().put("数学" , new Score("优秀" , 92));
		session.save(person);
		tx.commit();
		HibernateUtil.closeSession();
	}
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值