[@EmbeddedId] 1、应用于实体类或映射超类的持久字段或属性,以表示可嵌入类的组合主键。 可嵌入的类必须标注为Embeddable。 2、使用EmbeddedId批注时,只能有一个EmbeddedId批注和没有Id批注。 3、AttributeOverride注解可用于覆盖可嵌入类中声明的列映射。 4、MapsId注释可以与EmbeddedId注释一起使用以指定派生的主键。 5、如果实体具有派生主键,那么AttributeOverride注释可能仅用于覆盖嵌入ID的那些与父实体关系不对应的属性。 6、不支持在嵌入式id类中定义的关系映射。
@Embeddable @Data public class EmployeeId implements Serializable { private int id; }
@Embeddable @Data public class DependentId implements Serializable { private String name; private EmployeeId empPK; // corresponds to primary key type of Employee }
package sun.rain.amazing.javax.anno.domain.embedded; import lombok.Data; import javax.persistence.EmbeddedId; import javax.persistence.Entity; /** * @author sunRainAmazing */ @Entity @Data public class Employee { @EmbeddedId private EmployeeId ids; private String name; private String email; }
/* CREATE TABLE `employee` ( `id` int(11) NOT NULL, `email` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 注意 要删除 这张表 必须先删除dependent这张表 改成ids时 -- 同样是上面的代码 CREATE TABLE `employee` ( `id` int(11) NOT NULL, `email` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 */
package sun.rain.amazing.javax.anno.domain.embedded; import lombok.Data; import javax.persistence.*; @Entity @Data public class Dependent { // default column name for "name" attribute is overridden @AttributeOverride(name="name", column = @Column(name="dep_name")) @EmbeddedId private DependentId id; @MapsId("empPK") @ManyToOne private Employee emp; private String name; private String state; }
/* CREATE TABLE `dependent` ( `dep_name` varchar(255) NOT NULL, `name` varchar(255) DEFAULT NULL, `state` varchar(255) DEFAULT NULL, `emp_id` int(11) NOT NULL, PRIMARY KEY (`emp_id`,`dep_name`), CONSTRAINT `FKn66b78rv012l5ll5lbhk3v0em` FOREIGN KEY (`emp_id`) REFERENCES `employee` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 */