Ответ 1
Поскольку это очень распространенный вопрос, я решил написать подробную статью об этом.
Подводя итог, приведем следующие сопоставления, чтобы продемонстрировать, как можно сопоставить несколько сущностей в одной таблице базы данных:
@Entity(name = "Post")
public class Post {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
private String description;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
@Entity(name = "PostSummary")
@Table(name = "Post")
@Immutable
public class PostSummary {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity(name = "UpdatablePostSummary")
@Table(name = "Post")
@DynamicUpdate
public class UpdatablePostSummary {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
И Hibernate будет работать нормально:
@Test
public void testOneTableMultipleEntities() {
doInTransaction(session -> {
Post post = (Post) session.get(Post.class, 1L);
PostSummary postSummary = (PostSummary) session.get(PostSummary.class, 1L);
UpdatablePostSummary updatablePostSummary = (UpdatablePostSummary) session.get(UpdatablePostSummary.class, 1L);
assertEquals(post.getName(), postSummary.getName());
assertEquals(post.getName(), updatablePostSummary.getName());
updatablePostSummary.setName("Hibernate Master Class Tutorial.");
});
}
PostSummary
- это вид только для чтения вашей исходной сущности, поэтому я пометил его@Immutable
.UpdatablePostSummary
помечен@DynamicUpdate
, поэтому вы также можете распространять изменения из этого объекта View.
Этот тест также доступен на GitHub.