zoukankan      html  css  js  c++  java
  • hibernate 联合主键配置

    一.可行demo: 联合主键, id自增

    主键类可以把字段单独放一个类,实现Serializable接口,重写equals和hascode方法
    自增:@GeneratedValue(strategy=GenerationType.AUTO)
    表结构

    DROP TABLE IF EXISTS `test`;
    CREATE TABLE `test` (
      `id` bigint(19) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
      `trigger_type` int(2) NOT NULL COMMENT '触发类型:10驶入山西、20驶出山西、30驶入西安、40驶出西安',
      `trigger_position` varchar(200) CHARACTER SET utf8 DEFAULT NULL COMMENT '触发位置',
      PRIMARY KEY (`id`, `trigger_type`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='test'
    PARTITION BY LIST(trigger_type) (
        PARTITION shanxi VALUES IN (10, 20),
        PARTITION xian VALUES IN (30, 40)
    );    
    

    package com.entity;
    import lombok.Data;
    
    import javax.persistence.*;
    /**
     * @ClassName FenceLockCarEntity
     * @author xxxx
     * @version 1.0.0
     * @Description test
     */
    @Entity
    @Table(name = "test")
    @Data
    public class TestEntity {
    
        @Id
        private TestKey testkey;
        @Id
        @Embedded
        @AttributeOverrides({
                @AttributeOverride(name = "id", column = @Column(name = "id")),
                @AttributeOverride(name = "triggerType", column = @Column(name = "trigger_type"))
        })
        public TestKey getTestkey() {
            return testkey;
        }
    
        public void setTestkey(TestKey testkey) {
            this.testkey = testkey;
        }
    }    
    

    package com.entity;
    import javax.persistence.Column;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import java.io.Serializable;
    public class TestKey implements Serializable {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(nullable = false, name = "id", columnDefinition = "bigint")
        private Long id;
        /**
         * 触发类型:10驶入山西、20驶出山西、30驶入西安、40驶出西安
         */
        @Id
        @Column(nullable = false, name = "trigger_type")
        private Integer triggerType;
    
        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
        public Integer getTriggerType() {
            return triggerType;
        }
        public void setTriggerType(Integer triggerType) {
            this.triggerType = triggerType;
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (!(obj instanceof TestKey)) {
                return false;
            }
            TestKey key = (TestKey) obj;
    
            if (!this.id.equals(key.getId())) {
                return false;
            }
            if (!this.triggerType.equals(key.getTriggerType())) {
                return false;
            }
            return true;
        }
        @Override
        public int hashCode() {
            int result = 0;
            result = this.id == null ? 0 : this.id.hashCode();
            result = 29 * (this.triggerType == null ? 0 : this.triggerType.hashCode()) + result;
            return result;
        }
    }
    

    二.参考其他

    Hibernate用注解配置复合主键有三种方式
    ①@Embeddable + @Id + @Embedded
    ②@Embeddable + @EmbeddedId
    ③@IdClass + @Id
    解释:
    @Embeddable 表示这个类可以嵌入到别的类中去,常以表示其他类的某个属性。
    @Embedded 它和 @Embeddable 正好相反,它用来表示某个属性是被嵌入进来的。
    @EmbeddedId = @Embedded + @Id
    声明:
    如果采用第三种方式,则必须为主键类写上默认构造方法,因为Hibernate是通过默认构造方法来实例化主键类的对象的。
    首先,给出主键类的源代码:

    package cn.saicent.model;
    import java.io.Serializable;
    import javax.persistence.Embeddable;
    @Embeddable
    public class CompositeKeyModelKey implements Serializable {
    	private static final long serialVersionUID = 1717638966560959020L;
    	private Integer kkey1;
    	private Integer kkey2;
    	public CompositeKeyModelKey(Integer kkey1, Integer kkey2) {
    		this.kkey1 = kkey1;
    		this.kkey2 = kkey2;
    	}
    	public Integer getkkey1() {
    		return kkey1;
    	}
    	public void setkkey1(Integer kkey1) {
    		this.kkey1 = kkey1;
    	}
    	public Integer getkkey2() {
    		return kkey2;
    	}
    	public void setkkey2(Integer kkey2) {
    		this.kkey2 = kkey2;
    	}
    	@Override
    	public boolean equals(Object obj) {
    		if(this == obj) {
    			return true;
    		}
    		if(! (obj instanceof CompositeKeyModelKey)) {
    			return false;
    		}
    		CompositeKeyModelKey key = (CompositeKeyModelKey)obj;
    		if(!kkey1.equals(key.getkkey1())) {
    			return false;
    		}
    		if(!kkey2.equals(key.getkkey2())) {
    			return false;
    		}
    		return true;
    	}
    	@Override
    	public int hashCode() {
    		int result = 0;
    		result = kkey1 == null ? 0 : kkey1.hashCode();
    		result = 29 * (kkey2 == null ? 0 : kkey2.hashCode()) + result;
    		return result;
    	}
    }
    

    第一种方法(@Embeddable + @Id + @Embedded)的Pojo源代码如下:

    package cn.saicent.model;
    import javax.persistence.AttributeOverride;
    import javax.persistence.AttributeOverrides;
    import javax.persistence.Column;
    import javax.persistence.Embedded;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    @Entity
    @Table(name="COMPOSITE_KEY_TABLE")
    public class CompositeKeyModel {
    	private CompositeKeyModelKey compositeKeyModelKey;
    	private String field;
    	@Column(name = "FIELD")
    	public String getField() {
    		return field;
    	}
    	public void setField(String field) {
    		this.field = field;
    	}
    	@Id
    	@Embedded
    	@AttributeOverrides({
    		@AttributeOverride(name = "kkey1", column = @Column(name="KEY1")),
    		@AttributeOverride(name = "kkey2", column = @Column(name="KEY2"))
    	})
    	public CompositeKeyModelKey getCompositeKeyModelKey() {
    		return compositeKeyModelKey;
    	}
    	public void setCompositeKeyModelKey(CompositeKeyModelKey compositeKeyModelKey) {
    		this.compositeKeyModelKey = compositeKeyModelKey;
    	}
    }
    

    第二种方法(@Embeddable + @EmbeddedId)的Pojo源代码如下:

    package cn.saicent.model;
    
    import javax.persistence.AttributeOverride;
    import javax.persistence.AttributeOverrides;
    import javax.persistence.Column;
    import javax.persistence.EmbeddedId;
    import javax.persistence.Entity;
    import javax.persistence.Table;
    
    @Entity
    @Table(name="COMPOSITE_KEY_TABLE")
    public class CompositeKeyModel {
    	private CompositeKeyModelKey compositeKeyModelKey;
    	private String field;
    	@Column(name = "FIELD")
    	public String getField() {
    		return field;
    	}
    	public void setField(String field) {
    		this.field = field;
    	}
    	@EmbeddedId
    	@AttributeOverrides({
    		@AttributeOverride(name = "kkey1", column = @Column(name="KEY1")),
    		@AttributeOverride(name = "kkey2", column = @Column(name="KEY2"))
    	})
    	public CompositeKeyModelKey getCompositeKeyModelKey() {
    		return compositeKeyModelKey;
    	}
    	public void setCompositeKeyModelKey(CompositeKeyModelKey compositeKeyModelKey) {
    		this.compositeKeyModelKey = compositeKeyModelKey;
    	}
    }
    

    第三种方法(@IdClass + @Id)的Pojo类源代码如下:

    package cn.saicent.model;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.IdClass;
    import javax.persistence.Table;
    
    @Entity
    @Table(name="COMPOSITE_KEY_TABLE")
    @IdClass(CompositeKeyModelKey.class)
    public class CompositeKeyModel {
    	private Integer kkey1;
    	private Integer kkey2;
    	private String field;
    	@Column(name = "FIELD")
    	public String getField() {
    		return field;
    	}
    	public void setField(String field) {
    		this.field = field;
    	}
    	@Id
    	@Column(name = "KEY1")
    	public Integer getKkey1() {
    		return kkey1;
    	}
    	public void setKkey1(Integer kkey1) {
    		this.kkey1 = kkey1;
    	}
    	@Id
    	@Column(name = "KEY2")
    	public Integer getKkey2() {
    		return kkey2;
    	}
    	public void setKkey2(Integer kkey2) {
    		this.kkey2 = kkey2;
    	}
    }
    
  • 相关阅读:
    spring(1)
    mybatis(7)自定义结果集(一对多/多对一)
    延迟加载
    《构建之法》阅读笔记03
    http socket
    转换
    .net后台通过xmlhttp 和远程服务通讯
    XMLHttpRequest介绍
    js 贪吃蛇
    触发器
  • 原文地址:https://www.cnblogs.com/yaozhixiang/p/15066313.html
Copyright © 2011-2022 走看看