如何在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个实体即: Name
, Address
和Student
:
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(虚拟名称)。