注解
三类注解
注解含义作用
ORM标准规范JPA—per
@Table(name=”“) 不管name一不一样,name都写出来吧,做为一种规范。
User.java
@Entity
@Table(name = "User")
// @Proxy(lazy=false) 默认true 。
public class User implements java.io.Serializable {
private static final long serialVersionUID = 5528168703353159357L;
// Fields
private Integer id;
private String name;// 用户名
private String password;// 密码
private String telephone;// 电话
private String username;// 姓名
@Column(name = "ISADMIN")
private String isadmin;// 是否是管理员
private String msg;
// 一个用户可以注册多个房屋,一对多
private Set<House> houses = new HashSet<House>();
@OneToMany(cascade = { CascadeType.ALL },
fetch = FetchType.LAZY,
targetEntity = House.class,
mappedBy="Users") //那个类中House,与我相关的那个属性Users
//@mappedBy 属性简单理解为设定为主表
public Set<House> getHouses() {
return houses;
}
public void setHouses(Set<House> houses) {
this.houses = houses;
}
@Transient
// 临时。
public String getMsg() {
return msg;
}
@Id
// IDENTITY==MYSQL SEQUENCE==ORACLE
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_")
@SequenceGenerator(name = "seq", sequenceName = "SEQ_ID", allocationSize = 3)
// 这个才是序列的名字.all...是间距
@Column(name = "ID")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(name = "ISADMIN")
// 在每一个get加上也行。
public String getIsadmin() {
return isadmin;
}
public void setIsadmin(String isadmin) {
this.isadmin = isadmin;
}
House.java
@Entity
public class House implements java.io.Serializable {
// Fields
private Integer id;
private String title;// 标题
private String description;// 描述
private Double price;// 价格
private Date pubdate;// 发布时间
private Double floorage;// 面积
private String contact;// 联系人
private User users;
// Constructors
/** default constructor */
public House() {
}
@ManyToOne(targetEntity = User.class, fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
public User getUsers() {
return users;
}
public void setUsers(User users) {
this.users = users;
}
@Id
// IDENTITY==MYSQL SEQUENCE==ORACLE
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_")
@SequenceGenerator(name = "seq", sequenceName = "SEQ_ID", allocationSize = 3)
// 这个才是序列的名字.all...是间距
@Column(name = "ID")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Date getPubdate() {
return pubdate;
}
public void setPubdate(Date pubdate) {
this.pubdate = pubdate;
}
public Double getFloorage() {
return floorage;
}
public void setFloorage(Double floorage) {
this.floorage = floorage;
}
public String getContact() {
return contact;
}
public void setContact(String contact) {
this.contact = contact;
}
hibernate.cfg.xml
由映射文件改为注解之后就要在哈姆雷特的配置文件中由resource更改为CLASS。
<mapping class="cn.jbit.houserent.entity.House" />
<mapping class="cn.jbit.houserent.entity.User" />
Test.java
public class AnnoTest {
public static void main(String[] args) {
Transaction tx = null;
try {
tx = HibernateSessionFactory.getSession().beginTransaction();
User u=new User();
u.setName("注解");
u.setPassword("1231212");
House h=new House();
h.setTitle("注解房屋");
u.getHouses().add(h);//一
h.setUsers(u);//多
//一 有级联操作,保存一方就行了。
HibernateSessionFactory.getSession().save(u);
tx.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (tx != null) {
tx.rollback();
}
}
多对多
Employee.java
package common;
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.ManyToMany;
import javax.persistence.Table;
/**
* Employee entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "EMPLOYEE", schema = "SCOTT")
public class Employee implements java.io.Serializable {
// Fields
private Integer empid;
private String empname;
private Set<Project> projects = new HashSet<Project>(0);
// Constructors
/** default constructor */
public Employee() {
}
/** minimal constructor */
public Employee(Integer empid, String empname) {
this.empid = empid;
this.empname = empname;
}
/** full constructor */
public Employee(Integer empid, String empname, Set<Project> projects) {
this.empid = empid;
this.empname = empname;
this.projects = projects;
}
// Property accessors
@Id
@Column(name = "EMPID", unique = true, nullable = false, precision = 6, scale = 0)
public Integer getEmpid() {
return this.empid;
}
public void setEmpid(Integer empid) {
this.empid = empid;
}
@Column(name = "EMPNAME", nullable = false, length = 100)
public String getEmpname() {
return this.empname;
}
public void setEmpname(String empname) {
this.empname = empname;
}
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "employees")
public Set<Project> getProjects() {
return this.projects;
}
public void setProjects(Set<Project> projects) {
this.projects = projects;
}
}
Project.java
package common;
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.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
/**
* Project entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "PROJECT", schema = "SCOTT")
public class Project implements java.io.Serializable {
// Fields
private Integer proid;
private String proname;
private Set<Employee> employees = new HashSet<Employee>(0);
// Constructors
/** default constructor */
public Project() {
}
/** minimal constructor */
public Project(Integer proid, String proname) {
this.proid = proid;
this.proname = proname;
}
/** full constructor */
public Project(Integer proid, String proname, Set<Employee> employees) {
this.proid = proid;
this.proname = proname;
this.employees = employees;
}
// Property accessors
@Id
@Column(name = "PROID", unique = true, nullable = false, precision = 6, scale = 0)
public Integer getProid() {
return this.proid;
}
public void setProid(Integer proid) {
this.proid = proid;
}
@Column(name = "PRONAME", nullable = false, length = 100)
public String getProname() {
return this.proname;
}
public void setProname(String proname) {
this.proname = proname;
}
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "PROEMP",
joinColumns = { @JoinColumn(name = "RPROID") },
inverseJoinColumns = { @JoinColumn(name = "REMPID") })
public Set<Employee> getEmployees() {
return this.employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
}
注解中的命名查询
在那个类的最上头添加上就可以了。。。感觉没啥意义。。
@NamedQuery(name = "testNamedQuery",
query = "from Dept d left join d.emps e where d.deptno = :deptno")
Test.java
HibernateSessionFactory.getSession()
.getNamedQuery("testNamedQuery")
.setProperties(null)
.list();
SQL命名查询
@NameNativeQuery(name = "queryName", query = "sql...", resultSetMapping = "mapping")
@sqlResultSetMapping(name = "mapping",
entities = { @EntityResult(entityClass = District.class),
@EntityResult(EntityClass = Street.class) })