簡體   English   中英

我可以創建@Entity的@ElementCollection嗎?

[英]Can I create an @ElementCollection of @Entity?

我正在嘗試查找相關的JPA文檔,但是找不到任何指定是否允許創建實體的ElementCollection的內容。 我知道典型的用途是使@Embeddable的@ElementCollection,但是由於遇到Hibernate錯誤 ,我需要將可嵌入類變成其自己的實體。

我想保持實體的生命周期由父類控制。 因此,我希望不要為新實體創建任何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內部沒有辦法嗎?

您不能具有包含實體的ElementCollection,這是JPA中的互斥概念。

您可以根據需要嘗試一對多或多對多。 如果將獲取設置為熱切並級聯,那應該沒問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM