使用 @javax.persistence.AttributeOverride 处理 Multiple embeddable types 。
package org.example.demo.hibernate;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
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();
Contact person = new Contact();
person.home = new Address();
person.home.addr = "Beijing";
person.home.zipcode = "100000";
person.work = new Address();
person.work.addr = "Shanghai";
person.work.zipcode = "200000";
em.persist(person);
em.getTransaction().commit();
em.close();
factory.close();
}
@Entity(name = "Contact")
public static class Contact {
@Id
@GeneratedValue
Integer id;
@Embedded
@AttributeOverrides({ @AttributeOverride(name = "addr", column = @Column(name = "home_addr")),
@AttributeOverride(name = "zipcode", column = @Column(name = "home_zipcode")) })
Address home;
@Embedded
@AttributeOverrides({ @AttributeOverride(name = "addr", column = @Column(name = "work_addr")),
@AttributeOverride(name = "zipcode", column = @Column(name = "work_zipcode")) })
Address work;
}
@Embeddable
public static class Address {
String addr;
String zipcode;
}
}
生成 SQL
drop table if exists Contact cascade
drop sequence if exists hibernate_sequence
create sequence hibernate_sequence start 1 increment 1
create table Contact (id int4 not null, home_addr varchar(255), home_zipcode varchar(255), work_addr varchar(255), work_zipcode varchar(255), primary key (id))
select nextval ('hibernate_sequence')
insert into Contact (home_addr, home_zipcode, work_addr, work_zipcode, id) values ('Beijing', '100000', 'Shanghai', '200000', 1)