如何在Hibernate / javax.persistance中映射一个具有多个表的类?

我想用一个类映射三个表。 我知道javax.persistance提供了@SecondaryTable注释来将两个表映射到一个类。

下面是我使用@SecondaryTable的代码。 它允许我只定义一个辅助表。 但我需要同一个类使用3个表。

 @Entity @Table(name = "table1") @SecondaryTable(name="table2") public class TableConfig implements Serializable { /** * */ private static final long serialVersionUID = 1L; @Id @Column(name = "mac", table= "table1") private String uniqueIdentifier; 

我想使用一个类来映射三个表,据我所知,javax.persistance提供了@SecondaryTable注释来将两个表映射到一个类

使用@SecondaryTables映射多个表。

您可以使用@SecondaryTables类级别注释将单个实体bean映射到多个表。 要表示列在特定表中,请使用@Column@JoinColumn的table参数。


例如,有3个实体即: NameAddressStudent

Name实体将如下所示:

 @Entity @Table(name="name") public class Name implements Serializable { @Id @Column(name="id") private int id; @Column(name="name") private String name; public Name(){} public Name(int id,String name){ this.id=id; this.name=name; } //getters and setters } 

Address实体将如下所示:

 @Entity @Table(name="address") public class Address implements Serializable { @Id @Column(name="id") private int id; @Column(name="address") private String address; public Address(){} public Address(int id, String address) { super(); this.id = id; this.address = address; } //getters and setters } 

Student实体将如下所示:

 @Entity @Table(name="student") @SecondaryTables({ @SecondaryTable(name="name", pkJoinColumns={ @PrimaryKeyJoinColumn(name="id", referencedColumnName="student_id") }), @SecondaryTable(name="address", pkJoinColumns={ @PrimaryKeyJoinColumn(name="id", referencedColumnName="student_id") }) }) public class Student implements Serializable { @Id @Column(name="student_id") private int studentId; @Column(table="name") private String name; @Column(table="address") private String address; public Student(){} public Student(int studentId){ this.studentId=studentId; } //getters and setters } 

存储如:

  Student s= new Student(1); session.save(s); Name n=new Name(s.getStudentId(),"Bilal Hasan"); session.save(n); Address address = new Address(s.getStudentId(), "India"); session.save(address); Student ob = (Student)session.get(Student.class, s.getStudentId()); System.out.println(ob.getStudentId()); System.out.println(ob.getName()); System.out.println(ob.getAddress()); 

输出继电器:

 1 Bilal Hasan India 

你可以定义一个类,如下所示:

 @Entity @Table(name="table1") @SecondaryTables({ @SecondaryTable(name="table2", pkColumnJoins={@PrimaryKeyJoinColumn(name = "id")}), @SecondaryTable(name="table3", pkColumnJoins={@PrimaryKeyJoinColumn(name = "id")}) }) public class TestEntity { @Id @GeneratedValue private int id; private String field1; @Column(name="column2", table="table2") private String field2; @Column(name="column3", table="table3") private String field3; getter and setter... } 

在你的数据库中,应该有三个表,并且它们都应该具有相同的主键“id”。

然后,使用可以像这样测试:

 TestEntity test = new TestEntity(); test.setField1("field1"); test.setField2("field2"); test.setField3("field3"); em.merge(test); 

经过测试,在您的数据库中,您将在每个表中找到一条记录:

表格1:

  1, field1 

表2:

  1, field2 

表3:

  1, field3 

所有这些都将共享主键值。 希望这会帮助你。

在Hibernate映射文件中,您可以使用虚拟名称指定实体名称映射以及polymorphism="explicit" ,类名称将是物理类名称。 像那样你可以做多个映射。 加载对象时使用entityname(虚拟名称)。