我正在尝试查找相关的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中没有办法吗?
答案 0 :(得分:2)
您不能拥有包含实体的ElementCollection,这些是JPA中的互斥概念。
根据您的需要,您可以尝试一对多或多对多。如果您将提取设置为eager并级联,则应该没问题。