`
schy_hqh
  • 浏览: 552335 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Hibernate结合JAXB的另类用法

 
阅读更多

颠覆一下Hibernate的一般用法

一对多关系时,一般都是在多的一端维护关联关系,但不一定任何时候都好用!!!

 

特定场景:

需要在一的一端维护关系。

使用JAXB进行对象转xml的时候,这样做非常方便!

多的一方不能持有一的一方的引用,否则在转换XML的时候会循环调用导致失败!

 

POM

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.gc.sis</groupId>
  <artifactId>sis-core</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>sis-core</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>  
        <groupId>org.hibernate</groupId>  
        <artifactId>hibernate-core</artifactId>  
        <version>4.2.6.Final</version>  
    </dependency>  
      
   <dependency>  
        <groupId>mysql</groupId>  
        <artifactId>mysql-connector-java</artifactId>  
        <version>5.1.26</version>  
    </dependency>  
      
    <dependency>  
        <groupId>log4j</groupId>  
        <artifactId>log4j</artifactId>  
        <version>1.2.16</version>  
    </dependency>  
  </dependencies>
</project>

 

实体类

package com.gc.sis.core;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
@Table(name="illu")
@XmlRootElement
public class Illu {
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int id;
	
	private int singlePrem;
	
	//级联保存,删除等;不使用懒加载策略,在查询Illu对象的同时,联合查询Client
	@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
	private Set<Client> clients;
	
	//级联保存,删除等;不使用懒加载策略,在查询Illu对象的同时,联合查询Rider
	@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
	private Set<Rider> riders;
	
	
	public Illu() {
		super();
	}



	public int getId() {
		return id;
	}

	public int getSinglePrem() {
		return singlePrem;
	}


	public void setSinglePrem(int singlePrem) {
		this.singlePrem = singlePrem;
	}


	public Set<Client> getClients() {
		if(clients==null)
			clients = new HashSet<Client>();
		return clients;
	}


	public void setClients(Set<Client> clients) {
		this.clients = clients;
	}


	public Set<Rider> getRiders() {
		if(riders==null)
			riders = new HashSet<Rider>();
		return riders;
	}


	public void setRiders(Set<Rider> riders) {
		this.riders = riders;
	}
	
	
}

 

package com.gc.sis.core;

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

@Entity
@Table(name="client")
public class Client {
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int id;
	
	private String name;
	
	private int age;
	
	private String profession;
	
	
	public Client() {
		
	}
	
	public Client(String name, int age, String profession) {
		super();
		this.name = name;
		this.age = age;
		this.profession = profession;
	}



	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 String getProfession() {
		return profession;
	}
	public void setProfession(String profession) {
		this.profession = profession;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result
				+ ((profession == null) ? 0 : profession.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Client other = (Client) obj;
		if (age != other.age)
			return false;
		if (id != other.id)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (profession == null) {
			if (other.profession != null)
				return false;
		} else if (!profession.equals(other.profession))
			return false;
		return true;
	}

	
	
}

 

package com.gc.sis.core;

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

@Entity
@Table(name="rider")
public class Rider {
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int id;
	
	private String riderCode;
	
	private String riderName;
	
	private boolean basic;
	

	
	public Rider() {
		super();
	}
	public Rider(String riderCode, String riderName, boolean basic) {
		super();
		this.riderCode = riderCode;
		this.riderName = riderName;
		this.basic = basic;
	}
	public String getRiderCode() {
		return riderCode;
	}
	public void setRiderCode(String riderCode) {
		this.riderCode = riderCode;
	}
	public String getRiderName() {
		return riderName;
	}
	public void setRiderName(String riderName) {
		this.riderName = riderName;
	}
	public boolean isBasic() {
		return basic;
	}
	public void setBasic(boolean basic) {
		this.basic = basic;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (basic ? 1231 : 1237);
		result = prime * result + id;
		result = prime * result
				+ ((riderCode == null) ? 0 : riderCode.hashCode());
		result = prime * result
				+ ((riderName == null) ? 0 : riderName.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Rider other = (Rider) obj;
		if (basic != other.basic)
			return false;
		if (id != other.id)
			return false;
		if (riderCode == null) {
			if (other.riderCode != null)
				return false;
		} else if (!riderCode.equals(other.riderCode))
			return false;
		if (riderName == null) {
			if (other.riderName != null)
				return false;
		} else if (!riderName.equals(other.riderName))
			return false;
		return true;
	}

	
	
}

 

Hibernate配置文件

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/illu</property>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		
		<property name="show_sql">true</property>
		
		<property name="hibernate.hbm2ddl.auto">update</property>
		
		<!--如果使用的是本地事务(jdbc事务)  ,此配置将不需要再close session了;
			getCurrentSession创建的session会和绑定到当前线程,而openSession不会;
			getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭;
		-->
		<property name="current_session_context_class">thread</property>  
		
		<!-- 如果使用的是全局事务(jta事务) -->
		<!-- 
		<property name="hibernate.current_session_context_class">jta</property>  
		 -->
	        <!-- 指定实体的具体路径,否则hibernate找不到 -->	 
      		<mapping class="com.gc.sis.core.Illu"/>
      		<mapping class="com.gc.sis.core.Client"/>
      		<mapping class="com.gc.sis.core.Rider"/>
	</session-factory>
</hibernate-configuration>

 

Hibernate工具类

package com.gc.sis.util;

import java.util.Map;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateUtil {
	
	private static SessionFactory factory;
	
	private static ServiceRegistry serviceRegistry;
	
	static{

		Configuration cfg = new Configuration().configure();
		Map map = cfg.getProperties();
		for(Object key : map.keySet()) {
			//可以打印出很多系统属性!
			//System.out.println(key);
			//System.out.println(map.get(key));
		}
		serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
		factory = cfg.buildSessionFactory(serviceRegistry);
	}
	
	public static Session getSession() {
		return factory.getCurrentSession();
	}
}

 

测试类

package com.gc.sis.core;

import java.util.Set;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

import junit.framework.TestCase;

import org.hibernate.Session;
import org.junit.Test;

import com.gc.sis.util.HibernateUtil;

public class HibernateTest  extends TestCase{
	
	/**
	 * 保存数据
	 */
	@Test
	public void testSave() {
		int singlePrem = 10000;
		Illu illu = new Illu();
		illu.setSinglePrem(singlePrem);

		Client c1 = new Client("zs", 20, "teacher");
		Client c2 = new Client("ls", 30, "worker");
		illu.getClients().add(c1);
		illu.getClients().add(c2);
		Rider r1 = new Rider("PE01", "A", true);
		Rider r2 = new Rider("MM02", "B", false);
		illu.getRiders().add(r1);
		illu.getRiders().add(r2);
		Session session = HibernateUtil.getSession();
		try {
			session.beginTransaction();
			session.save(illu);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}
		System.out.println("session connect:"+session.isConnected());//自动关闭
	}
	
	/**
	 * 获取数据
	 */
	public void testGet() {
		Session session = HibernateUtil.getSession();
		try {
			session.beginTransaction();
			Illu illu = (Illu)session.get(Illu.class, 1);
			System.out.println(illu.getSinglePrem());
			Set<Client> clients = illu.getClients();
			for(Client c : clients) {
				System.out.println(c.getName()+","+c.getAge()+","+c.getProfession());
			}
			Set<Rider> riders = illu.getRiders();
			for(Rider r : riders) {
				System.out.println(r.getRiderCode()+","+r.getRiderName()+","+r.isBasic());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}
	}
	
	/**
	 * 对象转xml
	 */
	public void testObject2XML() {
		Session session = HibernateUtil.getSession();
		try {
			session.beginTransaction();
			Illu illu = (Illu)session.get(Illu.class, 1);
			JAXBContext ctx = JAXBContext.newInstance(Illu.class);
			Marshaller marshaller = ctx.createMarshaller();
			marshaller.marshal(illu, System.out);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}
	}
}

 

对象转为XML的结果

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<illu>
	<clients>
		<age>30</age>
		<id>1</id>
		<name>ls</name>
		<profession>worker</profession>
	</clients>
	<clients>
		<age>20</age>
		<id>2</id>
		<name>zs</name>
		<profession>teacher</profession>
	</clients>
	<riders>
		<basic>true</basic>
		<riderCode>PE01</riderCode>
		<riderName>A</riderName>
	</riders>
	<riders>
		<basic>false</basic>
		<riderCode>MM02</riderCode>
		<riderName>B</riderName>
	</riders>
	<singlePrem>10000</singlePrem>
</illu>

 

分享到:
评论

相关推荐

    JAXB API jar 用于JDK9.0 解决Hibernate

    这导致在JDK 9及更高版本中使用依赖于JAXB的库,如Hibernate,可能会遇到类找不到的错误。 描述中提到的问题就是典型的由于JDK 9中JAXB移除引发的。当尝试在JDK 9环境中运行使用Hibernate的应用时,如果应用程序...

    idea 中用jaxb 读xml中数据

    在Java开发环境中,IntelliJ IDEA(简称Idea)是一款非常流行的集成开发工具。...总的来说,Idea结合JAXB为处理XML数据提供了一种高效且直观的方式。了解和掌握这一技术能帮助开发者更便捷地处理XML相关的任务。

    jaxb功能用法

    在这个"jaxb功能用法"的讨论中,我们将深入探讨如何利用JAXB进行XML与Java Bean之间的转换,并结合XSD(XML Schema)进行数据验证。 ### JAXB的基本概念 1. **绑定文件**:JAXB的配置通常通过一个名为`jaxb-...

    JAXB的安装包及插件

    **JAXB的基本用法** - **生成Java类**:JAXB提供了一个工具`xjc`,可以将XML Schema文档转换为对应的Java类。 - **对象到XML**:使用`Marshaller`类将Java对象转换为XML文档。 - **XML到对象**:使用`Unmarshaller`...

    JAXB的 eclipse插件

    JAXB(Java Architecture for XML Binding)是Java平台上的一个标准,它提供了一种在Java对象和XML文档之间进行映射的机制。Eclipse作为一款强大的Java集成开发环境,为开发者提供了丰富的插件支持,其中包括JAXB的...

    JAXB2 jaxb-api.jar jaxb-xjc.jar jaxb-impl.jar activation.jar

    JAXB2,全称为Java Architecture for XML Binding 2,是Java平台上的一个标准技术,用于在XML和Java对象之间进行绑定。它允许开发者通过简单的API将XML文档转换为Java对象,反之亦然,大大简化了XML数据处理。JAXB2...

    javax.rar(jaxb-impl-2.3.0、jaxb-core-2.3.0、jaxb-api-2.3.0)

    标题中的"jaxb-impl-2.3.0、jaxb-core-2.3.0、jaxb-api-2.3.0"是JAXB的不同组件版本号,它们在处理XML到Java对象之间的转换时起到关键作用。在描述中提到的“Maven项目中缺少jaxb-api的异常报错”,通常指的是在运行...

    jaxb-api jaxb-impl jar

    `jaxb-api`和`jaxb-impl`是JAXB框架的核心组成部分。这两个JAR文件在处理XML到Java对象的绑定过程中扮演着关键角色。 1. **jaxb-api.jar**: 这个库包含了JAXB API,即Java接口和抽象类,定义了JAXB的工作方式。它...

    jaxb-api-2.1.jar 和 jaxb-impl-2.1.8.jar

    `jaxb-api-2.1.jar` 和 `jaxb-impl-2.1.8.jar` 是Java应用程序中用于XML绑定(Java Architecture for XML Binding,简称JAXB)的重要库文件。JAXB是Java SE和Java EE平台的标准部分,它提供了一种将XML文档与Java...

    jaxb-impl.jar包

    4. **数据持久化**:虽然不如ORM框架如Hibernate那么强大,但JAXB也能实现简单的XML数据持久化。 5. **XML文档生成**:生成符合特定格式的XML报告或者文档,如报表、日志等。 **最佳实践** 使用JAXB时,应注意...

    JAXB的使用JAXB的使用

    **JAXB(Java Architecture for XML Binding)**是Java平台中用于XML到Java对象绑定的一种标准技术,它使得Java开发者能够方便地在XML文档和Java对象之间进行数据转换。JAXB提供了一种自动化的方式,将XML Schema...

    jaxb2.1jar包

    虽然JAXB主要用于XML到Java对象的映射,但JAX-WS常常与JAXB结合使用,用于生成和消费Web服务。JAX-WS中的`javax.xml.ws`包包含了用于创建Web服务客户端和服务端的接口和类。 **四、JAXB2.1的应用场景** 1. **Web...

    jaxb-ri-2.2.7

    - **与Java EE集成**:在Java EE环境中,JAXB常与其他技术如JAX-WS(Web服务)结合使用,简化了XML数据交换。 在实际应用中,开发者可以使用JAXB进行以下操作: - **序列化**:将Java对象转换为XML文档,用于网络...

    JAXB乱码问题解决

    在Java开发中,JAXB(Java Architecture for XML Binding)是一个用于将XML文档和Java对象之间进行绑定的技术。在处理XML文件时,特别是涉及到序列化和反序列化时,可能会遇到字符编码问题,即所谓的“乱码”。这个...

    jaxb2.3.0依赖jar.rar

    Java Architecture for XML Binding (JAXB) 是Java平台中用于XML到Java对象绑定的标准技术,它允许开发者在Java程序中直接操作XML数据,而无需编写大量的XML解析和序列化代码。JAXB 2.3.0是该技术的一个版本,包含了...

    jaxb生成XML例子

    JAXB (Java Architecture for XML Binding) 是 Java 中用于对象到XML以及XML到对象转换的API。它使得开发者能够轻松地将Java对象模型映射到XML文档,并反之亦然。在给定的例子中,我们将深入理解如何使用JAXB注解来...

    jaxb-impl.jar jaxb-api.jar jsr173_1.0_api.jar

    JAXB有时会与StAX结合使用,特别是在处理大量XML数据时,StAX可以提供更高效的性能。 此外,压缩包中还有`activation.jar`,这是一个JavaBeans Activation Framework (JAF)的实现,用于支持Java对象的激活和序列化...

    JAXB的HelloWorld源码

    **源码分析** 对于初学者来说至关重要,因为可以直接查看和理解实际的Java代码,了解JAXB如何与Java类结合工作,以及XML如何被映射和解析。 **XML** 是JAXB的核心,是数据交换的标准格式。理解XML的基本结构和语法...

    activation.jar jaxb1-impl.jar jaxb-api.jar jaxb-impl.jar jaxb-xjc.jar jsr173_1.0

    这些文件是Java编程环境中常用的库文件,主要用于XML绑定(Java Architecture for XML Binding,JAXB)和JavaBeans Activation Framework(JAF)。在Java应用程序开发中,尤其是处理XML数据时,这些库扮演着至关重要...

Global site tag (gtag.js) - Google Analytics