hibernate注释

注解映射必须满足两大条件:Hibernate3.2以上版本和JSEE 5。

@Entity 类注释,所有要持久化的类都要有

Java代码

@Entity

public class Org implements java.io.Serializable {

}

@Entitypublic class Org implements java.io.Serializable {}

@Id 主键

Java代码

@Id

@GeneratedValue

private String orgId;

private String orgName;

@Id @GeneratedValue private String orgId; private String orgName;

@Column(name="...") 该属性对应表中的字段是什么,没有name表示一样

@Table 对象与表映射

@UniqueConstraint 唯一约束

@Version 方法和字段级,乐观锁用法,返回数字和timestamp,数字为首选

@Transient 暂态属性,表示不需要处理

@Basic 最基本的注释。有两个属性:fetch是否延迟加载,optional是否允许null

@Enumerated 枚举类型

@Temporal 日期转换。默认转换Timestamp

@Lob 通常与@Basic同时使用,提高访问速度。

@Embeddable 类级,表可嵌入的

@Embedded 方法字段级,表被嵌入的对象和@Embeddable一起使用

@AttributeOverrides 属性重写

@AttributeOverride 属性重写的内容和@AttributeOverrides一起嵌套使用

@SecondaryTables 多个表格映射

@SecondaryTable 定义辅助表格映射和@SecondaryTables一起嵌套使用

@GeneratedValue 标识符生成策略,默认Auto

表与表关系映射

@OneToOne:一对一映射。它包含五个属性:

targetEntity:关联的目标类

Cascade:持久化时的级联操作,默认没有

fetch:获取对象的方式,默认EAGER

Optional:目标对象是否允许为null,默认允许

mappedBy:定义双向关联中的从属类。

单向:

@JoinColumn:定义外键(主表会多一字段,做外键)

@OneToMany:一对多映射;@ManyToOne:多对一映射

单向一对多:

@OneToMany(cascade=CascadeType.ALL)

@JoinColumn(name="book_oid")/**book:表;oid:book表的主键;无name会按此规则自动生成*/

单向多对一:

@ManyToOne(cascade=CascadeType.ALL)

@JoinColumn(name="author_oid")

关联表格一对多:

@OneToMany(cascade=CascadeType.ALL)

@JoinTable(joinColumn={@JoinColumn(name="BOOK_OBJECT_OID")},inverseJoinColumns={@JoinColumn(name="AUTHER_OBJECT_OID")})

双向一对多或多对一:

不需要多一张表,只是使用mappedBy:使用在One一方,值为One方类名表示Many的从属类。

Java代码

@Entity

public class Org implements java.io.Serializable {





// Fields

@Id

@GeneratedValue

private String orgId;

private String orgName;

@OneToMany(mappedBy = "org")

private List<Department> departments;



// Constructors

...

// Property accessors

...

}

@Entitypublic class Org implements java.io.Serializable { // Fields @Id @GeneratedValue private String orgId; private String orgName; @OneToMany(mappedBy = "org") private List<Department> departments; // Constructors... // Property accessors...}

Java代码

@Entity

public class Department implements java.io.Serializable {





// Fields

@Id

@GeneratedValue

private String id;

private String name;

@ManyToOne(fetch=FetchType.EAGER)

@JoinColumn(name="org_orgId")

private Org org;

@OneToMany(mappedBy = "department")

private List<Employee> employees;



// Constructors



public List<Employee> getEmployees() {

return employees;

}



public void setEmployees(List<Employee> employees) {

this.employees = employees;

}



public Org getOrg() {

return org;

}



public void setOrg(Org org) {

this.org = org;

}



/** default constructor */

.

.

.



}

@Entitypublic class Department implements java.io.Serializable { // Fields @Id @GeneratedValue private String id; private String name; @ManyToOne(fetch=FetchType.EAGER) @JoinColumn(name="org_orgId") private Org org; @OneToMany(mappedBy = "department") private List<Employee> employees; // Constructors public List<Employee> getEmployees() { return employees; } public void setEmployees(List<Employee> employees) { this.employees = employees; } public Org getOrg() { return org; } public void setOrg(Org org) { this.org = org; } /** default constructor */ . . . }

Java代码

@Entity

public class Employee implements java.io.Serializable {





// Fields

@Id

@GeneratedValue

private String employeeId;

private String employeeName;

private String passWord;

private Integer age;

private Integer sex;

@ManyToOne(fetch=FetchType.EAGER)

@JoinColumn(name="department_id")

private Department department;





public Department getDepartment() {

return department;

}



public void setDepartment(Department department) {

this.department = department;

}



/** default constructor */

...

// Property accessors

...

}

@Entitypublic class Employee implements java.io.Serializable { // Fields @Id @GeneratedValue private String employeeId; private String employeeName; private String passWord; private Integer age; private Integer sex; @ManyToOne(fetch=FetchType.EAGER) @JoinColumn(name="department_id") private Department department; public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } /** default constructor */ ... // Property accessors ...}

双向多对多:@ManyToMany.单向多对多这里不在赘述(没有太多实际意义)

这个比较简单,看下代码就明白了:

Java代码

@Entity

public class Book implements java.io.Serializable {

@Id

private int id;

private String name;

private float money;

@ManyToMany(cascade = CascadeType.ALL)

private List<Author> authors;





public List<Author> getAuthors() {

return authors;

}

public void setAuthors(List<Author> authors) {

this.authors = authors;

}



...

}

@Entitypublic class Book implements java.io.Serializable { @Id private int id; private String name; private float money; @ManyToMany(cascade = CascadeType.ALL) private List<Author> authors; public List<Author> getAuthors() { return authors; } public void setAuthors(List<Author> authors) { this.authors = authors; } ...}

Java代码

@Entity

public class Author implements java.io.Serializable {

@Id

private int id;

private String name;

private int age;

@ManyToMany(mappedBy="authors")

private List<Book> books;





public List<Book> getBooks() {

return books;

}



public void setBooks(List<Book> books) {

this.books = books;

}



...

}

@Entitypublic class Author implements java.io.Serializable { @Id private int id; private String name; private int age; @ManyToMany(mappedBy="authors") private List<Book> books; public List<Book> getBooks() { return books; } public void setBooks(List<Book> books) { this.books = books; } ...}

需要注意的是:注释最好加在属性上,不要加在get方法上,那样做有时候就会出错。比如:@ManyToMany的时候就会报错!



注意import javax.xx.Entity ,而不是org.hibernate.xx.Entity。

Descn属性不存在于数据库中,用@Transient 注明

------------------------------------------

1,需要: Hibernate库文件,Hibernate Annotations库,ejb3-persstence.jar(Java 持久化API)

sessionFactory=new AnnotationConfiguration().buildSessionFactory();

------------------------------------------

2,<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

<property name="annotatedClasses">

<list>

<value>com.onjava.modelplanes.domain.PlaneType</value>

</list>

</property>

</bean>

------------------------------------------

1,@Entity

@Table(name = "teacher_info")

@IdClass(UUIDHexGenerator.class)

public class UserMember implements java.io.Serializable

2,@entity通过getters/setters方法访问,或直接访问他的成员变量。

@Entity(access = AccessType.PROPERTY)

@Entity(access = AccessType.FIELD)

------------------------------------------

映射标识符

1,@Id

@GeneratedValue(strategy = GenerationType.AUTO)

private String id;

2,@Id(generate=GeneratorType.SEQUENCE, generator='SEQ_STORE')

3,@Id(generate=GeneratorType.IDENTITY)

------------------------------------------

映射属性

1,@Transient

2,@Column(name="PLANE_ID", length=80, nullable=true)

3,@Basic(fetch = FetchType.LAZY)

4,@Serialized 凡标识@Serialized的属性将被序列化

public Country getCountry() { ... }

5,@Lob标识了存储对象可能是个CLOB或者BLOB。

@Lob(type=LobType.CLOB)

public String getFullText(){return fullText;}

@Lob(type = LobType.BLOB)

public byte[] getFullCode() {return fullCode;}

@Version 定义乐观锁机制使用

------------------------------------------

关联关系:

一、一对一:

1,@OneToOne(mappedBy = "address")

public User getUser() {

return user;

}

1、两边都定义了@OneToOne,但都没有定义mappedBy,则user和address表都会生成到对方的外键,双方都是这个关系的拥有者。

2、两边都定义了@OneToOne,如果user定义了mappedBy,则在address表生成到user的外键,address是这个关系的拥有者;如果address定义

了mappedBy,则在user表生成到address的外键,user是这个关系的拥有者。



二、一对多,多对一:

2,@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )

3,@OneToMany(mappedBy="planeType",cascade=CascadeType.ALL, fetch=FetchType.EAGER)

@OrderBy("name")

public List<ModelPlane> getModelPlanes() {

return modelPlanes;

}

其中定义mappedBy的是@OneToMany,也就是说One这一方是关系的拥有者。Many一方的表中生成到关联类的外键。



三、@ManyToMany

private Set authors = new HashSet<Author>();

@ManyToMany

public Set<Author> getAuthors(){

return authors;

}



private Set books = new HashSet<Book>();

@ManyToMany(mappedBy="authors")

public Set<Book> getBooks(){

return books;

}

@ManyToMany会生成中间表,具体表名和字段可以通过@AssociationTable来定义,默认的就可以了,同样关系的非拥有者,需要定义mappedBy属性。

------------------------------------------

命名查询

你也可以通过注解,利用@NameQueries和@NameQuery注解,如下:

@NamedQueries(

{

@NamedQuery(name="planeType.findAll",query="select p from PlaneType p" ),

@NamedQuery(name="planeType.delete",query="delete from PlaneType where id=:id" )

}

)

------------------------------------------

内嵌对象(组件)

@Embedded({

@AttributeOverride(name='iso2', column = @Column(name='bornIso2') ),

@AttributeOverride(name='name', column = @Column(name='bornCountryName') )

})

Country bornIn;

...

}



@Embeddable(access = AccessType.FIELD)

public class Address implements Serializable {

String city;

Country nationality;

}





@Embeddable

public class Country implements Serializable {

private String iso2;

private String name;



public String getIso2() { return iso2; }

public void setIso2(String iso2) { this.iso2 = iso2; }



@Column(name='countryName')

public String getName() { return name; }

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

...

}

------------------------------------------

自定义的主键生成策略

@javax.persistence.GeneratedIdTable(

name='GEN_TABLE',

table = @Table(name='GENERATOR_TABLE'),

pkColumnName = 'key',

valueColumnName = 'hi'

)



@javax.persistence.TableGenerator(

name='EMP_GEN',

tableName='GEN_TABLE',

pkColumnValue='EMP',

allocationSize=20

)

@javax.persistence.SequenceGenerator(

name='SEQ_GEN',

sequenceName='my_sequence'

)

package org.hibernate.test.metadata;



school和userMember是一对多关系

import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.OneToMany;

import javax.persistence.Table;

import javax.persistence.Temporal;

import javax.persistence.TemporalType;



import org.hibernate.annotations.Formula;

import org.hibernate.annotations.GenericGenerator;



@Entity

@Table(name = "school_info")

public class SchoolInfo implements java.io.Serializable {



@Id

@GeneratedValue(generator = "system-uuid")

@GenericGenerator(name = "system-uuid", strategy = "uuid")

private String id;//hibernate的uuid机制,生成32为字符串



@Column(name = "actcodeId", updatable = false, nullable = true, length = 36)

private String actcodeId;



@Formula("select COUNT(*) from school_info")

private int count;



@Temporal(TemporalType.TIMESTAMP)//不用set,hibernate会自动把当前时间写入

@Column(updatable = false, length = 20)

private Date createTime;



@Temporal(TemporalType.TIMESTAMP)

private Date updateTime;// 刚开始我默认insertable=false,但会读取出错提示如下:

// Value '0000-00-00' can not be represented as java.sql.Timestamp



// mappedBy="school"就相当于inverse=true,(mappedBy指定的是不需要维护关系的一端)

// 应该注意的是mappedBy值对应@ManyToOne标注的属性,我刚开始写成"schoolId",让我郁闷了好一会

@OneToMany(mappedBy = "school", cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = UserMember.class)

// 用范性的话,就不用targetEntity了

private List users = new ArrayList();



}

@GeneratedValue(strategy=GenerationType.AUTO)我们常用的自增长机制,我这里采用的是hibernate的uuid生成机制.

需要注意的是import javax.xx.Entity ,而不是org.hibernate.xx.Entity。

郁闷的是我上面用到@Formula,生成的sql竟然是'select COUNT(*) from school_info as formula0_ from school_info schoolinfo0_,当然不能执行了,寻求正解中~!!!!!!!!!

UserMember.java(前面引入的包已经贴过了,下面就不贴了)



@Entity

@Table(name = "teacher_info")//实体类和数据库表名不一致时,才用这个

public class UserMember implements java.io.Serializable {



@Id

@GeneratedValue(generator = "system-uuid")

@GenericGenerator(name = "system-uuid", strategy = "uuid")

private String id;



@Column(updatable = false, nullable = false, length = 20)

private String logonName;



@Temporal(TemporalType.TIMESTAMP)

@Column(updatable = false, length = 20)

private Date createTime;



@Temporal(TemporalType.TIMESTAMP)

private Date updateTime;



@ManyToOne(cascade = { CascadeType.MERGE })

@JoinColumn(name = "schoolId")

private SchoolInfo school;

//注意该类就不用声明schoolId属性了,如果不用@JoinColumn指明关联的字段,hibernate默认会是school_id.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate 支持使用自定义注解来实现实体类和数据库表之间的映射关系。您可以使用 `@javax.persistence.Table` 注解来指定实体类与数据库表之间的映射关系,使用 `@javax.persistence.Column` 注解来指定实体类属性与数据库列之间的映射关系。 例如,如果您想要将一个名为 `Person` 的实体类映射到一个名为 `person_info` 的数据库表上,您可以使用以下注解: ```java @Entity @Table(name = "person_info") public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "full_name") private String fullName; @Column(name = "age") private int age; // 省略 getter 和 setter 方法 } ``` 在上面的例子中,`@Table(name = "person_info")` 注解指定了 `Person` 实体类与 `person_info` 数据库表之间的映射关系,`@Column(name = "full_name")` 注解指定了 `fullName` 属性与 `full_name` 数据库列之间的映射关系,`@Column(name = "age")` 注解指定了 `age` 属性与 `age` 数据库列之间的映射关系。 您也可以自定义自己的注解来简化实体类的编写工作。例如: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface EntityMapping { String tableName(); String[] columnNames(); } ``` 上面的代码定义了一个 `@EntityMapping` 注解,用于指定实体类的映射关系。您可以将这个注解应用到实体类上,如下所示: ```java @Entity @EntityMapping(tableName = "person_info", columnNames = {"full_name", "age"}) public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String fullName; private int age; // 省略 getter 和 setter 方法 } ``` 在上面的例子中,`@EntityMapping(tableName = "person_info", columnNames = {"full_name", "age"})` 注解指定了 `Person` 实体类与 `person_info` 数据库表之间的映射关系,以及 `fullName` 和 `age` 属性与数据库表中的哪些列之间的映射关系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值