添加方式:
一是写在属性字段上面。
二是写在属性的get访问器上面。
主要有:
@Id,
@SequenceGenerator
@GeneratedValue
@Colum
@Embedded
@EmbeddedId
@Lob
@Version
@Basic
@Transient
@Id
@Id:定义了映射到数据库主键属性,可以有一个或者多个属性被映射为主键,可以置于主键属性或者get方法前。
注意:如果定义了多个主键属性,该实体类必须实现serializable接口。
对于多个主键属性的例子,在实体类中继承接口:
@GeneratedValue
@GeneratedValue(strategy=GenerationType, generator="");
可选,用于定义主键生成策略。
strategy表示主键生成策略,取值有:
1,GenerationType.Auto:根据底层数据库自动选择(默认)。
2,GenerationType.INDENTITY:使用数据库的Identity字段生成。
3,GenerationtType.SEQUENCE:使用Sequence来决定主键的取值。
4,GenerationtType.TABLE:使用指定表来决定主键取值,结合@TableGenerator使用。
如:
@Id,
@TableGenerator(name="tab_cat_gen",allocationSize=1)
@GeneratedValue(Strategy=GenerationType.TABLE)
Generator-表示主键生成器名称,这个属性通常和ORM框架相关,
例如:hibernate可以指定uuid等主键生成方式。
发现执行过程中添加了自增,且大小为1.
@Column
@Column-可将属性映射到列,使用该注解来覆盖默认值,@Column描述了数据库中该字段的详细定义。
这对于根据JPA注解生成数据库结构的宫建非常有用。
@Embedded(注意不是@Embeddable)
@Embedded是注释属性的,表示该属性的类是嵌入类。
注意:同时嵌入类也必须标注@Embeddable。
同时嵌入类:
@EmbeddedId
通常使用嵌入式主键实现复合主键。
注意:嵌入式主键类必须实现Serializable接口,必须有默认的public 无参数的构造方法,必须重写覆盖equals和hashCode方法。
实例:
第一步:新建一个复合主键的嵌入类。
需要注意:1,加上Embeddable表示嵌入类,2,因为复合主键的两个属性是string类型,要控制大小,加上Column,
3,复写equals和hashcode方法。
package Com.Entity; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Embeddable; //学生主键类 @Embeddable public class StudentsPK implements Serializable { private static final long serialVersionUID = 1L;//因为继承了序列化接口,这里生成一个版本号 @Column(length=18) private String id;//身份证号码 @Column(length=8) private String sid;//学号 public StudentsPK() { } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((sid == null) ? 0 : sid.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; StudentsPK other = (StudentsPK) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (sid == null) { if (other.sid != null) return false; } else if (!sid.equals(other.sid)) return false; return true; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } }
第二步:在实体类中加上这个复合主键类对象。
需要注意:1,对于普通的嵌入对象,加上@Embedded,2,对于复合主键对象,加上@EmbeddedId,并且还要加上@Id,
3,别忘了对与新加的属性,加上get/set方法。
package Com.Entity; import java.io.Serializable; import java.util.Date; import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.EmbeddedId; import javax.persistence.Entity;/*JPA主键*/ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; /*学生实体类*/ @Entity @Table(name="Students",schema="sys") public class Students implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.AUTO) @EmbeddedId private StudentsPK sid; private String sname;//姓名 private String gender;//性别 private Date birthday; private String major;//专业 @Embedded private Address address; public Students() { } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public Students(StudentsPK sid, String sname, String gender, Date birthday, String major, Address address) { //super(); this.sid = sid; this.sname = sname; this.gender = gender; this.birthday = birthday; this.major = major; this.address=address; } public StudentsPK getSid() { return sid; } public void setSid(StudentsPK sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } }
第三步:加上测试类:
package Com.Entity; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.junit.Test; public class AddStudents { @Test public void testAddStudents() { //创建配置对象 Configuration config=new Configuration().configure(); //创建服务注册对象。 ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build(); //创建会话工厂对象 SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry); //创建会话对象 Session session=sessionFactory.openSession(); //开启事务 Transaction transaction=session.beginTransaction(); //创建一个学生对象 Address add=new Address("7932322","武当山","312321"); //创建一个学生主键对象 StudentsPK pk=new StudentsPK(); pk.setId("93328217421234834"); pk.setSid("94323423"); Students s=new Students(pk,"张三丰","男",new Date(),"太极拳",add); session.save(s); transaction.commit(); } }
第四步:验证:成功插入:
最开始报错了,如下写的:
@Test public void testAddStudents() { //创建配置对象 Configuration config=new Configuration().configure(); config.addClass(Students.class);//这个需要加上(视频里面没有) //创建服务注册对象。 ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder() .applySettings(config.getProperties()).build(); //通过config.getProperties()读取配置文档。 //创建会话工厂对象 SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry); //创建会话对象 Session session=sessionFactory.openSession(); //开启事务 Transaction transaction=session.beginTransaction(); //创建一个学生对象 Address add=new Address("7932322","武当山","312321"); //创建一个学生主键对象 StudentsPK pk=new StudentsPK(); pk.setId("93328217421234834"); pk.setSid("94323423"); Students s=new Students(pk,"张三丰","男",new Date(),"太极拳",add); session.save(s); transaction.commit(); }
后来发现是这句话的原因导致报错:这句话会去调用hbm.xml,因为这里没有使用hbm.xml的方式,使用的注解方式。
config.addClass(Students.class);
ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder() .applySettings(config.getProperties()).build(); //通过config.getProperties()读取配置文档。
改成如下方式:
@Test public void testAddStudents() { //创建配置对象 Configuration config=new Configuration().configure(); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build(); //创建会话工厂对象 SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry); //创建会话对象 Session session=sessionFactory.openSession(); //开启事务 Transaction transaction=session.beginTransaction(); //创建一个学生对象 Address add=new Address("7932322","武当山","312321"); //创建一个学生主键对象 StudentsPK pk=new StudentsPK(); pk.setId("93328217421234834"); pk.setSid("94323423"); Students s=new Students(pk,"张三丰","男",new Date(),"太极拳",add); session.save(s); transaction.commit(); }
@Transient
可选,表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。如果一个属性并非数据库表的字段映射,
必须将其标示为@Transient,否则ORM框架默认其注解为@Basic。