hibernate实体类映射


从Java的角度讲,实体类就是普通的POJO。

仅从POJO中Hibernate并不能得知实体类对应哪个数据表,因此还需要以某种方式配置一下。

常用的方式有*.hbm.xml文件配置与@注解配置两种。

 

@注解配置

实体类一般有id、普通属性、集合属性等,分别对应数据库的主键、普通列、外键。

@Entity

实体类

@Table

数据表

@Id

主键

@Column

配置普通属性

@OneToMany、@ManyToOne、@OneToOne、@ManyToMany

配置实体间的关系

所有的@注解都是javax.persistence.*下的,而不是org.hibernate.*下。javax.persistence.*下的注解为JPA规范规定的注解,用于标实体类与数据库的映射关系,而org.hibernate.*下的注解仅用于补充,当某个功能JPA暂时不支持而Hibernate支持时使用。

@Entity                       //@Entity表示该类能被Hibernate持久化

@Table(name = "tb_cat")       // 指定该Entity对应的数据表名

publicclassCat {

@Id                                               // 指定该列为主键

@GeneratedValue(strategy = GenerationType.AUTO)    // 主键生成策略,autoauto_increment

private Integer id;

@Column(name="name")                   // 指定属性对应的数据库表的列名为name

private String name;   

private String description;            // 同上,@columnname属性均可省略

 

@ManyToOne                             // 指定实体类之间多对一的关系

@JoinColumn(name="mother_id")          // 该属性对应的列

private Cat mother;       

 

@Temporal(TemporalType.TIMESTAMP)      // 日期类型(DATETIMETIMESTEMP

@Column(name="createDate")

private Date createDate;

 

// 省略各Field的getter、setter方法

}

 

 

XML配置

多个实体类可以配置在一个XML文件中。Hibernate推荐使用一个同名的XML文件配置一个实体类,便于阅读与维护。

XML文件一般以".hbm.xml"结尾,便于辨认,当然也可以直接用".xml"结尾。

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- Mapping file autogenerated by MyEclipse Persistence Tools-->

<hibernate-mapping>

<classname="bar.foo.hibernate.entity.Cat"table="tb_cat">

<idname="id" column="id">

<generatorclass="native" />

</id>

<many-to-onename="mother" column="mother_id" />

<propertyname="createDate" column="createDate" />

<propertyname="description" column="description" />

<propertyname="name" column="name" />

</class>

</hibernate-mapping>

 

 

配置到Hibernate.cfg.xml中

<!-- 在Hibernate中声明用@注解配置的实体类 -->

<mapping class="bar.foo.hibernate.entity.Cat"/>

 

<!-- 在Hibernate中声明用XML配置的实体类 -->

<mapping resource="bar/foo/hibernate/entity/Cat.hbm.xml"/>

 

 

今天就先写到这里,更多学习资料  

private static void printTableMetaInfo(Session session) { Connection connection = session.connection(); try { DatabaseMetaData metaData = connection.getMetaData(); ResultSet result = metaData.getColumns(null, null, NameOfTable, null); String strInJava = ""; String typeInJava; while (result.next()) { String columnName = result.getString(4); if ("stampTime".equalsIgnoreCase(columnName)) { continue; } int columnType = result.getInt(5); String nameFirstLetterLower = columnName.substring(0, 1).toLowerCase() + columnName.substring(1); switch (columnType) { case Types.VARCHAR: case Types.LONGVARCHAR: case Types.LONGNVARCHAR: case Types.NVARCHAR: case Types.CHAR: typeInJava = "String"; break; case Types.TINYINT: case Types.SMALLINT: case Types.INTEGER: typeInJava = useInteger ? "Integer" : "int"; break; case Types.TIMESTAMP: case Types.BINARY: typeInJava = "Calendar"; break; case Types.DECIMAL: typeInJava = "BigDecimal"; break; case Types.BIGINT: typeInJava = "BigInteger"; break; case Types.LONGVARBINARY: typeInJava = "byte[]"; break; case Types.DATE: typeInJava = "Calendar"; break; default: throw new Exception("Unknown type " + columnType + " and column is " + columnName); } strInJava += " private " + typeInJava + " " + nameFirstLetterLower + ";\n"; // strInHibernate += "\n"; } String str = "import javax.persistence.Entity;\n" + "import javax.persistence.Id;\n" + "import javax.persistence.Table;\n" + "import java.util.Calendar;\n\n"; str += "@Entity\n"; str += "@Table(name=\"$\")\n".replace("$", NameOfTable); str += "public class $ {\n".replace("$", NameOfTable.substring(2)); str += "\n @Id\n"; str += strInJava; str += "}"; System.out.println(str); StringSelection stringSelection = new StringSelection(str); Clipboard clpbrd = Toolkit.getDefaultToolkit().getSystemClipboard(); clpbrd.setContents(stringSelection, null); } catch (Exception e) { e.printStackTrace(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值