zoukankan      html  css  js  c++  java
  • 02-hibernate注解-属性级别注解

    添加方式:

    一是写在属性字段上面。

    二是写在属性的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 无参数的构造方法,必须重写覆盖equalshashCode方法。

    实例:

    第一步:新建一个复合主键的嵌入类。

    需要注意: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。

  • 相关阅读:
    虚拟机搭建Hadoop集群
    多线程编程之保护性暂挂模式
    Java多线程编程之不可变对象模式
    多线程编程之两阶段终止模式
    Spring自定义标签解析与实现
    Spring Bean注册解析(二)
    苹果ios开发
    java
    layui 单选项 点击显示与隐藏
    PHP -- 七牛云 在线视频 获取某一帧作为封面图
  • 原文地址:https://www.cnblogs.com/alsf/p/7823134.html
Copyright © 2011-2022 走看看