embeddable types 通常用于将多个 basic type 组合在一起,用在多个 Entity 中。
两个注解
- @javax.persistence.Embeddable - 定义 embeddable types
- @javax.persistence.Embedded - 在 Entity 中引用 embeddable types
package org.example.demo.hibernate;
import javax.persistence.Embeddable;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Persistence;
public class Test {
public static void main(String[] args) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = new Person();
person.name = new Name();
person.name.firstName = "Bruce";
person.name.lastName = "Lee";
em.persist(person);
em.getTransaction().commit();
em.close();
factory.close();
}
@Entity(name = "Person")
public static class Person {
@Id
@GeneratedValue
Integer id;
@Embedded
Name name;
}
@Embeddable
public static class Name {
String firstName;
String lastName;
}
}
生成 SQL
drop table if exists Person cascade
drop sequence if exists hibernate_sequence
create sequence hibernate_sequence start 1 increment 1
create table Person (id int4 not null, firstName varchar(255), lastName varchar(255), primary key (id))
select nextval ('hibernate_sequence')
insert into Person (firstName, lastName, id) values ('Bruce', 'Lee', 1)
Composition is part of good OO data modeling (idiomatic Java).
所以 embeddable 只是对于 java 来说的,对于 db 没有区别。