当前位置: 首页 > 知识库问答 >
问题:

我可以创建@Entity的@ElementCollection吗?

孙经艺
2023-03-14

我正在尝试查找相关的JPA文档,但很难找到任何指定是否允许我创建实体的ElementCollection的内容。我知道典型的用法是将@Embedded的@ElementCollection制作成一个@ElementCollection,但由于我遇到了一个Hibernate bug,我需要将我的可嵌入类制作成它自己的实体。

我希望实体的生命周期由父类控制。因此,我希望不要为新实体创建任何DAO/存储库。

尽管Hibernate允许这种情况发生(它正确地生成了DDL),但我还没有实际测试父实体的持久性。

此外,我还无法找到任何方法来指定到新实体的联接列映射。

例如,给定:

public class User {

    @TableGenerator( name="UUIDGenerator", pkColumnValue="user_id", table="uuid_generator", allocationSize=1)
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator="UUIDGenerator")
    @Column(name = "id")
    private Long id;

    /**
     * Address
     */
    @Valid
    @ElementCollection(fetch=FetchType.LAZY)
    @CollectionTable(name="user_address", joinColumns=@JoinColumn(name = "user_id", referencedColumnName = "id"))
    @OrderColumn
    private List<Address> address;

}

@Entity
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    /**
     * Multiple street lines allowable
     */
    @NotBlank
    @ElementCollection(targetClass=String.class, fetch=FetchType.LAZY)
    @CollectionTable( joinColumns=@JoinColumn(name = "address_id", referencedColumnName = "id"))
    @OrderColumn
    private List<String> street;

}

它生成以下MySQL表:

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `user_address` (
  `user_id` bigint(20) NOT NULL,
  `address` bigint(20) NOT NULL,
  `address_order` int(11) NOT NULL,
  PRIMARY KEY (`user_id`,`address_order`),
  UNIQUE KEY `UK_m09f5sbmw3q9drll2qig9i07q` (`address`),
  KEY `FK_m09f5sbmw3q9drll2qig9i07q` (`address`),
  KEY `FK_kfu0161nvirkey6fwd6orucv7` (`user_id`),
  CONSTRAINT `FK_kfu0161nvirkey6fwd6orucv7` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
  CONSTRAINT `FK_m09f5sbmw3q9drll2qig9i07q` FOREIGN KEY (`address`) REFERENCES `address` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `address_street` (
  `address_id` bigint(20) NOT NULL,
  `street` varchar(255) DEFAULT NULL,
  `street_order` int(11) NOT NULL,
  PRIMARY KEY (`address_id`,`street_order`),
  KEY `FK_jrcnrclixxqroefuqc7gjhoh` (`address_id`),
  CONSTRAINT `FK_jrcnrclixxqroefuqc7gjhoh` FOREIGN KEY (`address_id`) REFERENCES `address` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我想找到一种方法来更改用户地址的字段名<代码>地址。到目前为止,我能找到的唯一方法是将其设置为@OneToMany映射并使用@JoinTable()定义。在@ElementCollection中没有办法吗?

共有1个答案

梁丘亦
2023-03-14

您不能拥有包含实体的ElementCollection,它们在JPA中是相互排斥的概念。

您可以根据需要尝试一对多或多对多。如果您将fetching设置为eager和cascade,那么一切都应该正常。

 类似资料:
  • 我有一个实体,它有一个包含更多字段的可选子实体。子实体同样有一个元素集合。 这在Hibernate中通常是不可能的,还是我遗漏了什么? 错误消息为:

  • 在搜索了JPA文档和各种帖子后,我很困惑以下内容是否适用于JPA2。我刚开始学JPA所以如果我做了什么蠢事, 我的领域模型有一个“投资组合”,其中包含零个或多个“未平仓”。头寸由“工具”(JPA实体)和价格(双倍)组成。投资组合如下: OpenPosition嵌入式系统如下所示: 而该工具实体为: 当我试图使用这个时,模式被创建,我能够持久化投资组合,但是当我试图检索它们时,我在仪器类的hashC

  • 有什么方法可以为我创建的类使用自动装箱吗?例如,我有的子类。 现在,< code > UnsignedInteger I = new UnsignedInteger(88);工作得非常好,但是有什么方法可以让这个编译:< code > UnsignedInteger i = 88?对我来说不会。提前感谢!

  • 在key Vault中生成公钥以及随后的CSR是否可能?我在文档中没有看到任何关于生成相应公钥的提及?(或者我只是不明白HSM的本质?) 似乎可以在其他地方创建密钥和CSR,并将私钥导入到密钥库HSM中。这显然不如在HSM之外从未存在过的私钥好。

  • 我想将用户输入存储到ArrayList中,然后将该ArrayList放入另一个ArrayList中。这有点像一个主类别,它包含包含数据的子类别。 以下是一些代码: 我可以在"main Cat"ArrayList中添加"subCat"ArrayList吗?

  • 问题内容: 有什么方法可以对我创建的类使用自动装箱吗?例如,我有的子类。 现在,工作完全正常,但有什么办法,使这个编译:?不会适合我的 提前致谢! 问题答案: 简而言之,没有。没有办法将其编译。 Java仅定义了一组有限的预定义拳击转换。 在JLS中,第5.1.7节: 装箱转换将原始类型的表达式转换为引用类型的对应表达式。具体来说,以下九种转换称为装箱转换: 从布尔类型到布尔类型 从字节类型到字节