颠覆一下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>
相关推荐
这导致在JDK 9及更高版本中使用依赖于JAXB的库,如Hibernate,可能会遇到类找不到的错误。 描述中提到的问题就是典型的由于JDK 9中JAXB移除引发的。当尝试在JDK 9环境中运行使用Hibernate的应用时,如果应用程序...
在这个"jaxb功能用法"的讨论中,我们将深入探讨如何利用JAXB进行XML与Java Bean之间的转换,并结合XSD(XML Schema)进行数据验证。 ### JAXB的基本概念 1. **绑定文件**:JAXB的配置通常通过一个名为`jaxb-...
在Java开发环境中,IntelliJ IDEA(简称Idea)是一款非常流行的集成开发工具。...总的来说,Idea结合JAXB为处理XML数据提供了一种高效且直观的方式。了解和掌握这一技术能帮助开发者更便捷地处理XML相关的任务。
**JAXB的基本用法** - **生成Java类**:JAXB提供了一个工具`xjc`,可以将XML Schema文档转换为对应的Java类。 - **对象到XML**:使用`Marshaller`类将Java对象转换为XML文档。 - **XML到对象**:使用`Unmarshaller`...
标题中的"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`是JAXB框架的核心组成部分。这两个JAR文件在处理XML到Java对象的绑定过程中扮演着关键角色。 1. **jaxb-api.jar**: 这个库包含了JAXB API,即Java接口和抽象类,定义了JAXB的工作方式。它...
JAXB(Java Architecture for XML Binding)是Java平台上的一个标准,它提供了一种在Java对象和XML文档之间进行映射的机制。Eclipse作为一款强大的Java集成开发环境,为开发者提供了丰富的插件支持,其中包括JAXB的...
- **JAX-RS**(Java API for RESTful Web Services)通常与JAXB结合使用,以自动处理XML或JSON的序列化和反序列化。 - **JAXB与JPA**(Java Persistence API)结合,可以在数据库操作中方便地处理XML数据。 总结,...
`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...
4. **数据持久化**:虽然不如ORM框架如Hibernate那么强大,但JAXB也能实现简单的XML数据持久化。 5. **XML文档生成**:生成符合特定格式的XML报告或者文档,如报表、日志等。 **最佳实践** 使用JAXB时,应注意...
在实际应用中,JAXB通常与其他Java EE技术如JavaServer Faces (JSF)、Java Persistence API (JPA)等结合使用,提供一套完整的数据管理解决方案。例如,当接收到HTTP请求时,服务器端可以使用JAXB将接收到的XML数据...
JAXB有时会与StAX结合使用,特别是在处理大量XML数据时,StAX可以提供更高效的性能。 此外,压缩包中还有`activation.jar`,这是一个JavaBeans Activation Framework (JAF)的实现,用于支持Java对象的激活和序列化...
虽然JAXB主要用于XML到Java对象的映射,但JAX-WS常常与JAXB结合使用,用于生成和消费Web服务。JAX-WS中的`javax.xml.ws`包包含了用于创建Web服务客户端和服务端的接口和类。 **四、JAXB2.1的应用场景** 1. **Web...
这些文件是Java编程环境中常用的库文件,主要用于XML绑定(Java Architecture for XML Binding,JAXB)和JavaBeans Activation Framework(JAF)。在Java应用程序开发中,尤其是处理XML数据时,这些库扮演着至关重要...
- **与Java EE集成**:在Java EE环境中,JAXB常与其他技术如JAX-WS(Web服务)结合使用,简化了XML数据交换。 在实际应用中,开发者可以使用JAXB进行以下操作: - **序列化**:将Java对象转换为XML文档,用于网络...
Java Architecture for XML Binding (JAXB) 是Java平台中用于XML到Java对象绑定的标准技术,它允许开发者在Java程序中直接操作XML数据,而无需编写大量的XML解析和序列化代码。JAXB 2.3.0是该技术的一个版本,包含了...
标题提到的"jaxb-api.jar.jaxws-api.zip_ jaxb-api.jar_cxf_jax-ws.jar_jaxb-api",是针对这个问题提供的一组支持包。 **JAXB(Java Architecture for XML Binding)** 是Java平台的一个标准,它允许开发者将XML文...
JAXB (Java Architecture for XML Binding) 是 Java 中用于对象到XML以及XML到对象转换的API。它使得开发者能够轻松地将Java对象模型映射到XML文档,并反之亦然。在给定的例子中,我们将深入理解如何使用JAXB注解来...
JAXB2,全称为Java Architecture for XML Binding 2,是Java平台上的一个标准技术,用于在XML和Java对象之间进行绑定。它允许开发者通过简单的API将XML文档转换为Java对象,反之亦然,大大简化了XML数据处理。JAXB2...