如何在JPA中为ElementCollection的列创建外键?

问题描述

给出以下类模型:

package demo;

import java.util.Map;
import java.util.Set;
import javax.persistence.*;

@Embeddable
class Address {
  String street;
}

@Embeddable
class AddressDetails {
  byte[] photo;
}

@MappedSuperclass
abstract class User {
  @Id Long id;
  @ElementCollection(fetch = FetchType.EAGER) Set<Address> addresses;
  @ElementCollection Map<Address,AddressDetails> addressDetails; // wanted: FK to addresses
}

@Entity
class Sub1 extends User {}

@Entity
class Sub2 extends User {}

我正试图告诉JPA,addressDetails引用了addresses中的行。我该怎么办?

这是我想转换为注释的外键约束:

ALTER TABLE sub1_address_details
    ADD CONSTRAINT FK_sub1_address_address_details
        FOREIGN KEY (sub1_id,address_id)
            REFERENCES sub1_addresses
            ON DELETE CASCADE;

这是 Hibernate当前生成外键约束:

    alter table vblife_pv.sub1_addresses 
       add constraint FKdm58cvoq5gqndtlpr4t7auyct 
       foreign key (sub1_id) 
       references sub1

我尝试添加

@CollectionTable(joinColumns = {@JoinColumn(table = "addresses",referencedColumnName = "id")})

更改为addressDetails,但这不会更改Hibernate的DDL输出

我正在使用Hibernate 5.4.21。

解决方法

如果您确实希望这样做,则可能应该使用以下内容:

@Entity
@Table(name = "addresses")
public class UserAddress {
    @EmbeddedId
    UserAddressId id;
    @ManyToOne(LAZY)
    @JoinColumn(name = "address_id",insertable = false,updatable = false)
    Address address;
    @ManyToOne(LAZY)
    @JoinColumn(name = "user_id",updatable = false)
    User user;
    @OneToOne(mappedBy = "userAddress")
    AddressDetails details;
}
@Embeddable
public class UserAddressId {
    int addressId;
    int userId;
}
@Entity
@Table(name = "address_details")
public class AddressDetails {
    @EmbeddedId
    UserAddressId id;
    @OneToOne
    @JoinColumns({
    @JoinColumn(name = "user_id",referencedColumn = "user_id",updatable = false),@JoinColumn(name = "address_id",referencedColumn = "address_id",updatable = false)
    })
    UserAddress userAddress;
}