【问题标题】:JPA: One entity mapped to multiple rows, is it possible?JPA:一个实体映射到多行,有可能吗?
【发布时间】:2014-07-12 11:34:20
【问题描述】:

在 JPA 中,我可以将实体映射到一个表,其中该实体的属性跨多行保持不变?

基本上,我可以像这样映射一个类吗:

public Document {
    String id;
    String title;
    String author;
    String size;
}

到像这样的表

CREATE TABLE DOC_METADATA
(
    DOC_ID NUMBER,
    ATTR_NAME VARCHAR,
    ATTR_VALUE VARCHAR
);

内容类似

DOC_ID   | ATTR_NAME     | ATTR_VALUE
1          "title"         "Alice in wonderland"
1          "author"        "Lewis Carroll"
1          "size"          "500kb"
2          "title"         "Winnie the pooh"
2          "author"        "A. A. Milne"
2          "size"          "600kb"

【问题讨论】:

  • 这行得通。当您从表中查询所有数据时,您的表的每一行都会有一个实体实例。
  • 如果我运行 Document doc = em.find(Document.class, "1");文档中会有什么内容?
  • 它们不会跨多行持久化......每行有两个实体。不,你不能这样做
  • 我知道这不是标准或最佳实践,但至少您可能能够将该表中的各个字段映射为 OneToOne 关系?像 OneToOne(fetch=FetchType.EAGER) @JoinTable(name="DOC_METADATA" joinColumns=@JoinColumn(name="DOC_ID", referencedColumnName="ATTR_NAME")) 之类的东西基本上像映射普通实体一样映射字符串?跨度>

标签: java sql jpa openjpa


【解决方案1】:

不,这是不可能的。您的 class Document 是一个域类(您的表在 db 中的 java 表示形式)。当您尝试从域类创建表时,将创建一个包含此类字段的表,例如在您的域类中。

【讨论】:

  • 如果您有一个旧数据库并且必须读取/写入上述表格,您会怎么做?
  • 您应该在数据库中添加具有此类字段的域类,然后您可以使用此表进行操作。例如对于带有字段 DOC_ID | 的表ATTR_NAME | ATTR_VALUE - 你创建这样的类: public class DomainClass { private Long id;私有字符串名称;私有字符串值; getter 和 setter}。它将是您使用表的域类。
【解决方案2】:
猜你喜欢
  • 2015-07-02
  • 2013-08-18
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 2013-08-19
相关资源
最近更新 更多