【问题标题】:Can I create an @ElementCollection of @Entity?我可以创建@Entity 的@ElementCollection 吗?
【发布时间】:2013-12-03 20:09:19
【问题描述】:

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

我想保持实体的生命周期由父类控制。因此,我希望不要为新实体创建任何 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;

我想找到一种方法来更改 user_address.address 的字段名称。到目前为止,我能弄清楚如何做到这一点的唯一方法是使其成为 @OneToMany 映射并使用 @JoinTable() 定义。 @ElementCollection 内部没有办法吗?

【问题讨论】:

    标签: java hibernate jpa jpa-2.0


    【解决方案1】:

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

    您可以根据需要尝试一对多或多对多。如果你将 fetching 设置为 eager 并 cascade 就可以了。

    【讨论】:

    • 这就是我所怀疑的,但是 Hibernate 似乎允许构造。但是,我在 JPA 文档中找不到任何明确的参考,表明它是允许还是不允许。
    • javadocs 非常明确 Defines a collection of instances of a basic type or embeddable class docs.oracle.com/javaee/6/api/javax/persistence/…
    • 我想我不确定“可嵌入类”的定义是具体是 @Embeddable 还是包含更多内容。
    猜你喜欢
    • 1970-01-01
    • 2013-01-10
    • 2011-01-16
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2013-04-03
    • 2016-02-28
    相关资源
    最近更新 更多