Hibernate用注解配置复合主键
hibernate用注解配置复合主键有三种方式:
@Embeddable
@Id
@Embedded
@Embeddable
@EmbeddedId
@IdClass
@Id
解释一下这几种方法的区别:
@Embeddable
表示这个类可以嵌入到别的类中去,常以表示其他类的某个属性@Embedded
它和@Embeddable
正好相反,它用来表示某个属性是被嵌入进来的。 @EmbeddedId
= @Embedded
+ @Id
声明:
如果采用第三种方式,则必须为主键类写上默认构造方法,因为Hibernate是通过默认构造方法来实例化主键类的对象的。首先,给出主键类的源代码:
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
源代码如下:
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
源代码如下:
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
类源代码如下:
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; } }
版权声明
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。 本站博文除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。