导入Hibernate

本文介绍了一个使用Hibernate框架实现的Java应用程序案例,该程序通过实体关系映射技术实现了地址与地区之间的多对一关联。文章详细展示了如何配置Hibernate连接数据库,并通过具体的Java代码实现了查询特定地区的地址记录及保存新地址的功能。

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

src\chap06app:

Main.java

package chap06app;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;


public class Main{
	
	public static void main( String[] args ){
		
		SessionFactory sf = new AnnotationConfiguration().
							configure().buildSessionFactory();
		Session session = sf.openSession();
		
		Transaction tx = session.beginTransaction();
		try{
			// t_prefにTokyoとChibaがすでに入っているものとする。
			// Tokyoを見つける
			List<Pref> tokyoList = session.createQuery( "from Pref pref where pref.pref like 'Tokyo'" ).list();
			Pref tokyoPref;
			if( tokyoList.size() == 1 ){
				tokyoPref = (Pref)tokyoList.get( 0 );
			}else{
				throw new UnsupportedOperationException( "Tokyo not found!");
			}
			
			System.out.println( "tokyoPref id: " + tokyoPref.getId() );
			System.out.println( "TokyoPref pref: " + tokyoPref.getPref() );
			
			Address okadaAddr = new Address();
			okadaAddr.setName( "Okada" );
			okadaAddr.setPref( tokyoPref );
			okadaAddr.setAddress( "Edogawaku 1-2-3" );
			
			session.save( okadaAddr );
			
			tx.commit();
		}catch( HibernateException he ){
			if( tx != null ){ tx.rollback(); }	
		}finally{
			session.close();
			sf.close();
		}
	}
}

Pref.java

package chap06app;

import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "t_pref", schema = "public")
public class Pref implements java.io.Serializable {

	private int id;
	private String pref;
	private Set<Address> TAddresses = new HashSet<Address>(0);

	public Pref() {
	}

	public Pref(int id, String pref) {
		this.id = id;
		this.pref = pref;
	}

	public Pref(int id, String pref, Set<Address> TAddresses) {
		this.id = id;
		this.pref = pref;
		this.TAddresses = TAddresses;
	}

	@Id
	@Column(name = "id", unique = true, nullable = false)
	public int getId() {
		return this.id;
	}

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

	@Column(name = "pref", nullable = false)
	public String getPref() {
		return this.pref;
	}

	public void setPref(String pref) {
		this.pref = pref;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "pref")
	public Set<Address> getTAddresses() {
		return this.TAddresses;
	}

	public void setTAddresses(Set<Address> TAddresses) {
		this.TAddresses = TAddresses;
	}

}

Address.java

package chap06app;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "t_address2", schema = "public")
public class Address implements java.io.Serializable {

	private int id;
	private Pref pref;
	private String name;
	private String address;

	public Address() {
	}

	public Address(int id, Pref pref, String name, String address) {
		this.id = id;
		this.pref = pref;
		this.name = name;
		this.address = address;
	}

	@Id
	@Column(name = "id", unique = true, nullable = false)
	public int getId() {
		return this.id;
	}

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

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "pref_id_fk", nullable = false)
	public Pref getPref() {
		return this.pref;
	}

	public void setPref(Pref pref) {
		this.pref = pref;
	}

	@Column(name = "name", nullable = false)
	public String getName() {
		return this.name;
	}

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

	@Column(name = "address", nullable = false)
	public String getAddress() {
		return this.address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

}

src\out:

TAddress.java

// default package
// Generated 2009/01/29 0:32:15 by Hibernate Tools 3.2.1.GA

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

/**
 * TAddress generated by hbm2java
 */
@Entity
@Table(name = "t_address", schema = "public")
public class TAddress implements java.io.Serializable {

	private int id;
	private String name;
	private int pref;
	private String address;

	public TAddress() {
	}

	public TAddress(int id, String name, int pref, String address) {
		this.id = id;
		this.name = name;
		this.pref = pref;
		this.address = address;
	}

	@Id
	@Column(name = "id", unique = true, nullable = false)
	public int getId() {
		return this.id;
	}

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

	@Column(name = "name", nullable = false)
	public String getName() {
		return this.name;
	}

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

	@Column(name = "pref", nullable = false)
	public int getPref() {
		return this.pref;
	}

	public void setPref(int pref) {
		this.pref = pref;
	}

	@Column(name = "address", nullable = false)
	public String getAddress() {
		return this.address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

}

TAddress2.java

// default package
// Generated 2009/01/29 0:32:15 by Hibernate Tools 3.2.1.GA

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

/**
 * TAddress2 generated by hbm2java
 */
@Entity
@Table(name = "t_address2", schema = "public")
public class TAddress2 implements java.io.Serializable {

	private int id;
	private TPref TPref;
	private String name;
	private String address;

	public TAddress2() {
	}

	public TAddress2(int id, TPref TPref, String name, String address) {
		this.id = id;
		this.TPref = TPref;
		this.name = name;
		this.address = address;
	}

	@Id
	@Column(name = "id", unique = true, nullable = false)
	public int getId() {
		return this.id;
	}

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

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "pref_id_fk", nullable = false)
	public TPref getTPref() {
		return this.TPref;
	}

	public void setTPref(TPref TPref) {
		this.TPref = TPref;
	}

	@Column(name = "name", nullable = false)
	public String getName() {
		return this.name;
	}

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

	@Column(name = "address", nullable = false)
	public String getAddress() {
		return this.address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

}

TPref.java

// default package
// Generated 2009/01/29 0:32:15 by Hibernate Tools 3.2.1.GA

import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * TPref generated by hbm2java
 */
@Entity
@Table(name = "t_pref", schema = "public")
public class TPref implements java.io.Serializable {

	private int id;
	private String pref;
	private Set<TAddress2> TAddress2s = new HashSet<TAddress2>(0);

	public TPref() {
	}

	public TPref(int id, String pref) {
		this.id = id;
		this.pref = pref;
	}

	public TPref(int id, String pref, Set<TAddress2> TAddress2s) {
		this.id = id;
		this.pref = pref;
		this.TAddress2s = TAddress2s;
	}

	@Id
	@Column(name = "id", unique = true, nullable = false)
	public int getId() {
		return this.id;
	}

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

	@Column(name = "pref", nullable = false)
	public String getPref() {
		return this.pref;
	}

	public void setPref(String pref) {
		this.pref = pref;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "TPref")
	public Set<TAddress2> getTAddress2s() {
		return this.TAddress2s;
	}

	public void setTAddress2s(Set<TAddress2> TAddress2s) {
		this.TAddress2s = TAddress2s;
	}

}

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<!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.bytecode.use_reflection_optimizer">false</property>
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.connection.password">okada</property>
        <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/Chap04DB</property>
        <property name="hibernate.connection.username">okada</property>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="hibernate.show_sql">true</property>
        <mapping class="TAddress2" />
        <mapping class="TAddress" />
        <mapping class="TPref" />
    </session-factory>
</hibernate-configuration>

src:

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!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.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.connection.password">okada</property>
        <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/Chap04DB</property>
        <property name="hibernate.connection.username">okada</property>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="hibernate.show_sql">true</property>

		<mapping class="chap06app.Address"/>
        <mapping class="chap06app.Pref"/>
    </session-factory>
</hibernate-configuration>

代码来自日本的技术图书http://www.shuwasystem.co.jp/products/7980html/2197.html

<think>好的,用户想了解如何在Maven项目中导入Hibernate 6。首先,我需要回忆一下Hibernate和Maven的基本知识。Hibernate是一个流行的ORM框架,而Maven是项目管理和构建工具,通过pom.xml管理依赖。 用户提到的是Hibernate 6,所以我要确认最新的版本号。目前Hibernate 6的最新版本应该是6.4.4.Final,但需要检查官方网站或Maven仓库确认。同时,Hibernate 6需要Java 11或更高版本,这点要提醒用户注意。 接下来,在Maven项目中添加依赖,通常需要找到正确的groupId、artifactId和version。Hibernate的核心依赖是hibernate-core,所以应该添加org.hibernate.orm的groupId。记得用户可能还需要数据库驱动,比如MySQL的mysql-connector-java,以及JPA API,不过Hibernate 6可能已经包含JPA支持,可能需要添加jakarta.persistence-api。 另外,Hibernate 6可能使用了Jakarta EE 9+的命名空间,所以之前的javax.persistence要换成jakarta.persistence,这点需要确认,避免用户出现类找不到的错误。 然后,用户可能需要配置hibernate.cfg.xml或者使用persistence.xml,需要提供配置示例,比如数据库连接信息、方言等。Hibernate 6的方言类可能有所变化,比如从MySQL5Dialect变成MySQL8Dialect或者MySQLDialect,需要查证正确的类名。 还需要考虑日志配置,比如Log4j2,可能需要添加相关依赖,并排除旧的SLF4J绑定,避免冲突。用户示例中的log4j.properties可能不再适用,需要更新为Log4j2的配置方式。 可能遇到的问题包括依赖冲突、版本不兼容、配置错误等,需要给出常见问题解决方法。例如,Maven依赖范围是否正确,是否使用了正确的Java版本,以及如何配置Hibernate属性文件。 最后,生成相关问题,比如如何配置Hibernate与Spring Boot集成,或者如何执行基本CRUD操作,这可以帮助用户进一步学习。</think>要在Maven项目中集成Hibernate 6,请按照以下步骤操作: ### 第一步:配置pom.xml 在项目的pom.xml文件中添加Hibernate 6核心依赖和数据库驱动: ```xml <dependencies> <!-- Hibernate 6核心库 --> <dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-core</artifactId> <version>6.4.4.Final</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.3.0</version> </dependency> <!-- Jakarta Persistence API --> <dependency> <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> <version>3.1.0</version> </dependency> </dependencies> ``` 注意Hibernate 6使用Jakarta EE 9+规范,原`javax.persistence`包已更改为`jakarta.persistence`[^2] ### 第二步:创建Hibernate配置文件 在`src/main/resources`目录下新建`hibernate.cfg.xml`: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 数据库连接配置 --> <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password"></property> <!-- 方言配置 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 开发环境配置 --> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> </session-factory> </hibernate-configuration> ``` ### 第三步:配置日志(可选) 在`src/main/resources`目录下创建`log4j2.xml`: ```xml <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Logger name="org.hibernate.SQL" level="DEBUG"/> <Root level="ERROR"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` ### 验证安装的代码示例 ```java public class HibernateDemo { public static void main(String[] args) { try (SessionFactory sessionFactory = new Configuration() .configure("hibernate.cfg.xml") .addAnnotatedClass(Employee.class) .buildSessionFactory()) { System.out.println("Hibernate 6配置成功!"); } } } ``` ### 常见问题解决 1. 出现`NoClassDefFoundError`: - 检查Maven依赖是否下载完整 - 确认Jakarta API版本与Hibernate版本匹配 2. 连接数据库失败: - 验证数据库URL格式:`jdbc:mysql://host:port/dbname` - 检查MySQL服务是否启动 3. 日志不输出: - 确保log4j2.xml在classpath根目录 - 排除冲突的日志依赖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值