一.可行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;
}
}