Hibernate关联映射

本文详细介绍了单向关联关系在Hibernate中的实现方式,包括一对一、一对多和多对一的关系映射配置,并提供了具体的Java类定义及XML配置文件示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单向关联关系

单向1->1

和单向N->1配置唯一不一样的地方是在many-to-one的标签上加上unique=“true”,即可完成1->1的映射

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity">
	<class name="Person" table="person_inf">
		<!-- 映射标识属性 -->
		<id name="id" column="person_id">
			<!-- 指定主键生成器策略 -->
			<generator class="identity"/>
		</id>
		<property name="age" type="java.lang.Integer"/>
		<property name="name" type="java.lang.String"/>
		<many-to-one name="address" cascade="all" column="address_id" class="Address" unique="true"/>
	</class>
</hibernate-mapping>



单向1->N

public class Person
{
	private int id;
	private String name;
	private int age;
	private Set<Address> addresss=new HashSet<Address>();
	public Person(){}
	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;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Set<Address> getAddresss() {
		return addresss;
	}

	public void setAddresss(Set<Address> addresss) {
		this.addresss = addresss;
	}

}

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity">
	<class name="Person" table="person_inf">
		<!-- 映射标识属性 -->
		<id name="id" column="person_id">
			<!-- 指定主键生成器策略 -->
			<generator class="identity"/>
		</id>
		<property name="age" type="java.lang.Integer"/>
		<property name="name" type="java.lang.String"/>
		<set name="addresss">
			<key column="person_id"/>
			<one-to-many class="Address"/>
		</set>
	</class>
</hibernate-mapping>

Address类和之前的一样,要注意的是一对多关系,会先对主表进行操作在对从表进行操作,比如插入一条sql,会先对主表插入数据,这时候主表的id还为确定,会在之后根据从表信息更新主表,所以不效率建议使用双向一对多关系。


	public void singleOneToMany(){
		Session session=HibernateUtil.currentSession();
		tx=session.beginTransaction();
		Person p=new Person();
		Address a=new Address();
		a.setAddressDetail("上海");
		Address b=new Address();
		b.setAddressDetail("北京");
		session.persist(a);
		session.persist(b);
		p.setName("czk");
		p.setAge(23);
		p.getAddresss().add(a);
		p.getAddresss().add(b);
		session.save(p);
		tx.commit();
		HibernateUtil.closeSession();
	}



单向N->1

public class Person
{
	private int id;
	private String name;
	private int age;
	private Address address;
	public Person(){}
	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;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Address getAddress() {
		return address;
	}
	public void setAddress(Address address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age
				+ ", address=" + address.getAddressDetail() + "]";
	}
}

<hibernate-mapping package="entity">
	<class name="Person" table="person_inf">
		<!-- 映射标识属性 -->
		<id name="id" column="person_id">
			<!-- 指定主键生成器策略 -->
			<generator class="identity"/>
		</id>
		<property name="age" type="java.lang.Integer"/>
		<property name="name" type="java.lang.String"/>
		<many-to-one name="address" cascade="all" column="address_id" class="Address"/>
	</class>
</hibernate-mapping>

many-to-one的cascade属性设置为all 是为了设置增删查改的级联关系,每次操作从表都先对主表做操作

public class Address {
	private int adressId;
	private String addressDetail;
	public Address(){}

	public int getAdressId() {
		return adressId;
	}

	public void setAdressId(int adressId) {
		this.adressId = adressId;
	}

	public String getAddressDetail() {
		return addressDetail;
	}

	public void setAddressDetail(String addressDetail) {
		this.addressDetail = addressDetail;
	}
	
}

<hibernate-mapping package="entity">
	<class name="Address" table="address_inf">
		<id name="adressId" column="address_id">
			<generator class="identity"/>
		</id>
		<property name="addressDetail" type="java.lang.String">
			<column name="addressDetail"/>
		</property>
	</class>
</hibernate-mapping>

person_inf表


address_inf表




单向N->N



内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值