当表中一个主键不能唯一标识一条记录的时候,就需要使用联合主键了,下面是使用JPA注解实现联合主键的代码 1?首先需要建立一个复合主键类,用来存放需要生产联合主键的属性,该类需要实现序列化。 package?com.ericsson.adp.entity.cons; import?java.io.Serializable; public?class?ConsumerGroupMapPK?implements?Serializable{ ????private?String?msisdn;//电话号码 ????private?Long?tagGroupId;//(10)标签组id ????public?String getMsisdn() { ???????return?msisdn; ????} ????public?void?setMsisdn(String msisdn) { ???????this.msisdn?= msisdn; ????} ????public?Long getTagGroupId() { ???????return?tagGroupId; ????} ????public?void?setTagGroupId(Long tagGroupId) { ???????this.tagGroupId?= tagGroupId; ????} } ? 然后再写一个类,该类对应数据库中的表,在该类中需要使用@IdClass(ConsumerGroupMapPK.class)引入上面写的复合主键类 同时在需要做成联合主键的属性上面加上@Id标明该属性是主键就好了 package?com.ericsson.adp.entity.cons; ? import?javax.persistence.EmbeddedId; import?javax.persistence.Entity; import?javax.persistence.Id; import?javax.persistence.IdClass; import?javax.persistence.Table; ? import?org.hibernate.annotations.Cache; import?org.hibernate.annotations.CacheConcurrencyStrategy; @Entity @IdClass(ConsumerGroupMapPK.class) @Table(name="T_CONS_CONSUMER_GROUP_MAP") @Cache(usage=CacheConcurrencyStrategy.READ_WRITE) public?class?ConsumerGroupMap{ ????@Id ????private?String?msisdn;//电话号码 ????@Id ????private?Long?tagGroupId;//(10)标签组id ??? ????public?ConsumerGroupMap() { ???????super(); ???????//?TODO?Auto-generated constructor stub ????} ????public?ConsumerGroupMap(String msisdn, Long tagGroupId) { ???????super(); ???????this.msisdn?= msisdn; ???????this.tagGroupId?= tagGroupId; ????} ??? ????public?String getMsisdn() { ???????return?msisdn; ????} ????public?void?setMsisdn(String msisdn) { ???????this.msisdn?= msisdn; ????} ????public?Long getTagGroupId() { ???????return?tagGroupId; ????} ????public?void?setTagGroupId(Long tagGroupId) { ???????this.tagGroupId?= tagGroupId; ????} ??? }