zoukankan      html  css  js  c++  java
  • JPA使用GenerationType.TABLE生成主键

    1、新建保存每张表最新主键的 主键表

    clipboard

    2、修改实体类上的主键生成策略

    //进行映射的表的名称
    @Entity
    public class Customer {
    
        private Integer id;
        private String lastName;
    
        private String email;
        private int age;
        private Date createdTime;
        private Date birth;
        
        
    
        //生成主键的方式
        @TableGenerator(name="ID_GENERATOR", //name 属性表示该主键生成策略的名称,它被引用在@GeneratedValue中设置的generator 值中
                table="JPA_ID_GENERATOR",//table 属性表示表生成策略所持久化的表名
                pkColumnName="PK_NAME",//表示在持久化表中,该主键生成策略所对应键值的名称
                pkColumnValue="CUSTOMER_ID", // CUSTOMER_ID 对应的 PK_VALUE存储的就是 Customer表最新的一条数据的主键
                valueColumnName="PK_VALUE",//持久化表中,该主键当前所生成的值,它的值将会随着每次创建累加
                allocationSize=50)
        /*@GeneratedValue(strategy=GenerationType.AUTO)*/
        @Id
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        @Column(name="LAST_NAME",length=255,nullable=false)
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        @Column(name="EMAIL",length=50,nullable=false)
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        @Column(name="AGE")
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        // 创建时间精确到时间戳
        @Column(name="CREATED_TIME")
        @Temporal(TemporalType.TIMESTAMP)
        public Date getCreatedTime() {
            return createdTime;
        }
    
        public void setCreatedTime(Date createdTime) {
            this.createdTime = createdTime;
        }
    
        //生日则精确到天
        @Column(name="BIRTH")
        @Temporal(TemporalType.DATE)
        public Date getBirth() {
            return birth;
        }
    
        public void setBirth(Date birth) {
            this.birth = birth;
        }
    
        @Override
        public String toString() {
            return "Customer [id=" + id + ", lastName=" + lastName + ", email=" + email + ", age=" + age + ", createdTime="
                    + createdTime + ", birth=" + birth + "]";
        }
        
        
    }

    clipboard

    3、测试

    1) 查看控制台打印

    //每次向业务表插入数据时,去主键表查询该业务表的主键
    Hibernate: 
        select
            PK_VALUE 
        from
            JPA_ID_GENERATOR 
        where
            PK_NAME = 'CUSTOMER_ID' for update  
              
    Hibernate: 
        insert 
        into
            JPA_ID_GENERATOR
            (PK_NAME, PK_VALUE) 
        values
            ('CUSTOMER_ID', ?)
    Hibernate: 
        update
            JPA_ID_GENERATOR 
        set
            PK_VALUE = ? 
        where
            PK_VALUE = ? 
            and PK_NAME = 'CUSTOMER_ID'
    Hibernate: 
        insert 
        into
            Customer
            (AGE, BIRTH, CREATED_TIME, EMAIL, LAST_NAME, id) 
        values
            (?, ?, ?, ?, ?, ?)

    clipboard

  • 相关阅读:
    BGP的MA网络、自动汇总、聚合
    [转载]CISCO配置HSRP
    BGP选路十种方法总结 用实验详细介绍(副实验拓扑)
    [win技巧] windows 7的上帝模式你用过吗?【相信你没用过!如此方便的的设置】
    CISCO BGP(EBGP/IBGP)基本配置小结以及如何防止BGP路由黑洞(附实验拓扑)
    执行外部程序
    C#编写COM组件
    在SQL Server 2005上遇到了先删除已运行维护计划后,再删除代理中由其产生的作业时,提示删除失败,如何处理?
    关于存储过程编写的一点总结(转)
    WCF:调用方未由服务器进行身份验证
  • 原文地址:https://www.cnblogs.com/houchen/p/13290735.html
Copyright © 2011-2022 走看看