• java+hibernate+mysql


    实体类News

    package org.mythsky.hibernatedemo;
    
    import javax.persistence.*;
    
    @Entity
    @Table(name="news_inf")
    public class News {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        private String title;
        private String content;
    
        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 getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    }
    View Code

    hibernate.cfg.xml

    <?xml version='1.0' encoding='utf-8'?>
    
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
    
        <session-factory>
    
            <!-- Database connection settings -->
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://10.200.151.28/demo</property>
            <property name="connection.username">root</property>
            <property name="connection.password">password</property>
    
            <!-- JDBC connection pool (use the built-in) -->
            <property name="connection.pool_size">1</property>
    
            <!-- SQL dialect -->
            <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
    
            <!-- Disable the second-level cache  -->
            <!--<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>-->
    
            <!-- Echo all executed SQL to stdout -->
            <property name="show_sql">true</property>
    
            <property name="hibernate.format_sql">true</property>
    
            <!-- Drop and re-create the database schema on startup -->
            <property name="hbm2ddl.auto">update</property>
            <mapping class="org.mythsky.hibernatedemo.News"></mapping>
            <!--<mapping resource="News.hbm.xml"/>-->
    
        </session-factory>
    
    </hibernate-configuration>
    View Code

    注意这里IDE会提示

    但如果不用这个的话在创建表的时候会报错

    测试类NewsManager

    package org.mythsky.hibernatedemo;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.mapping.MetadataSource;
    import org.hibernate.service.ServiceRegistry;
    
    public class NewsManager {
        public static void main(String[] args){
            ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().configure().build();
            SessionFactory sessionFactory=new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
            Session session=sessionFactory.openSession();
            Transaction tx=session.beginTransaction();
            News news=new News();
            news.setTitle("my world");
            news.setContent("hello world");
            session.save(news);
            tx.commit();
            session.close();
            sessionFactory.close();
        }
    }
    View Code

    运行可以看到sql

     属性映射

    @Formula

    @Formula("(select concat(title,content) from news_inf where id=id)")
        private String fullContent;

    fullContent字段不会保存在表中,测试

    News n=(News)session.get(News.class,1);
            System.out.println(n.getFullContent());

    输出

    @Transient

    使用此注解的字段不会保存在表中

    @Enumerated

    枚举

    public enum Season {
        spring,summer,autumn,winter
    }

    修改News

    @Enumerated(EnumType.ORDINAL)
        private Season season;

    EnumType.ORDINAL保存的是枚举的值,例如1,EnumType.STRING保存的是名称,例如spring

    @Lob @Basic

    @Lob用来保存大数据类型

    byte[],Byte[]或java.io.Serializable保存为Blob

    char[],Character[]或java.lang.String保存为Clob

    @Lob
        @Basic(fetch = FetchType.LAZY)
        private byte[] pic;

    @Basic(fetch = FetchType.LAZY)表示延迟加载,@Basic(fetch = FetchType.EAGER,optional = false),optional表示是否允许null

    @Temporal

    @Temporal(TemporalType.DATE)
        private Date birth;

    TemporalType.DATE,TemporalType.TIME,TemporalType.TIMESTAMP分别对应数据库的类型

    映射集合属性

    List集合

    Person.java

    package org.mythsky.hibernatedemo;
    
    import javax.persistence.*;
    import java.util.ArrayList;
    import java.util.List;
    
    @Entity
    @Table(name = "person_inf")
    public class Person {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        private String name;
        private int age;
        @ElementCollection(targetClass = String.class)
        @CollectionTable(name = "school_inf",joinColumns = @JoinColumn(name = "person_id",nullable = false))
        @Column(name = "school_name")
        @OrderColumn(name = "list_order")
        private List<String> schools=new ArrayList<>();
    
        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 int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public List<String> getSchools() {
            return schools;
        }
    
        public void setSchools(List<String> schools) {
            this.schools = schools;
        }
    
    }
    View Code

    测试PersonManager.java

    package org.mythsky.hibernatedemo;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    
    public class PersonManager {
        public static void main(String[] args){
            SessionFactory sessionFactory;
            StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                    .configure() // configures settings from hibernate.cfg.xml
                    .build();
            try {
                sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
                Session session = sessionFactory.openSession();
                session.beginTransaction();
                Person person=new Person();
                person.setAge(20);
                person.setName("Tom");
                person.getSchools().add("小学");
                person.getSchools().add("中学");
                session.save(person);
                session.getTransaction().commit();
                session.close();
            }
            catch (Exception e) {
                StandardServiceRegistryBuilder.destroy( registry );
            }
        }
    }
    View Code

    注意在hibernate.cfg.xml中配置

    <mapping class="org.mythsky.hibernatedemo.Person"></mapping>

    运行后添加了两张表

     map集合

    @ElementCollection(targetClass = Float.class)
        @CollectionTable(name = "score_inf",joinColumns = @JoinColumn(name = "person_id",nullable = false))
        @MapKeyColumn(name = "subject_name")
        @MapKeyClass(String.class)
        @Column(name = "mark")
        private Map<String,Float> scores=new HashMap<>();
    View Code

    修改测试代码

    Person person=new Person();
                person.setAge(18);
                person.setName("Jerry");
                person.getSchools().add("小学");
                person.getSchools().add("中学");
                person.getScores().put("语文",90f);
                person.getScores().put("数学",100f);
                session.save(person);
    View Code

    可以看到新增的表

     联合主键

    Person2.java

    package org.mythsky.hibernatedemo;
    
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import java.io.Serializable;
    
    @Entity
    @Table(name = "person_inf2")
    public class Person2 implements Serializable {
        @Id
        private String first;
        @Id
        private String last;
        private int age;
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
    
            Person2 person2 = (Person2) o;
    
            return getFirst().equals(person2.getFirst())&&getLast().equals(person2.getLast());
        }
    
        @Override
        public int hashCode() {
            int result = getFirst() != null ? getFirst().hashCode() : 0;
            result = 31 * result + (getLast() != null ? getLast().hashCode() : 0);
            return result;
        }
    
        public String getFirst() {
            return first;
        }
    
        public void setFirst(String first) {
            this.first = first;
        }
    
        public String getLast() {
            return last;
        }
    
        public void setLast(String last) {
            this.last = last;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    View Code

    这里采用first和last作为联合主键,需要注意重写equals和hashCode方法。

    映射组件属性

    Name.java

    package org.mythsky.hibernatedemo;
    
    import org.hibernate.annotations.Parent;
    
    import javax.persistence.Column;
    import javax.persistence.Embeddable;
    
    @Embeddable
    public class Name {
        @Column(name = "fitstname")
        private String first;
        @Column(name = "lastname")
        private String last;
        @Parent
        private Person owner;
    
        public String getFirst() {
            return first;
        }
    
        public void setFirst(String first) {
            this.first = first;
        }
    
        public String getLast() {
            return last;
        }
    
        public void setLast(String last) {
            this.last = last;
        }
    
        public Person getOwner() {
            return owner;
        }
    
        public void setOwner(Person owner) {
            this.owner = owner;
        }
    
        public Name(String first, String last) {
    
            this.first = first;
            this.last = last;
        }
    
        public Name() {
    
        }
    }
    View Code

    注意Name需要实现Serializable接口,Person中将原来的String name去掉,换乘Name name;

    private Name name;

    修改测试代码

    Person person=new Person();
                person.setAge(18);
    //            person.setName("Jerry");
                Name name=new Name();
                name.setFirst("myth");
                name.setLast("sky");
                person.setName(name);
    View Code

    运行可以看到如下结果

  • 相关阅读:
    珠海洪锐在线监测agent_linux系统
    python中的不定长参数
    记一次刻苦铭心得安装zabbix经历
    狼书第三章Jinja2模板总结
    关于消息闪现的问题
    了解HTTP状态码
    关于用Flask建立一个简单的web应用
    将模块安装到Site-packages
    在Centos6中安装python3.6
    unity 生成缩略图 , 图片缩放
  • 原文地址:https://www.cnblogs.com/uptothesky/p/7840180.html
Copyright © 2020-2023  润新知