@JoinColumn using column from @ManyToOne entity table

I have the following database scheme (kept only the relevant tables): database scheme

I need to map organization_internet_domain_categorized into application_organization, but the column internet_domain_id belongs to the table application.

What I've tried:

@Entity
@Table(name = "application_organization")
@NoArgsConstructor
@Data
@EqualsAndHashCode(of = "id")
public class OrganizationApplication implements Serializable {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "organization_id", referencedColumnName = "organization_id", insertable = false, updatable = false),
            @JoinColumn(name = "application.internet_domain_id", referencedColumnName = "internet_domain_id", insertable = false, updatable = false)
    })
    private InternetDomainCategory internetDomainCategory;

    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "application_id", foreignKey = @ForeignKey(name = "fk_application_organization_application"))
    private Application application;

    // kept only the mapping part
}

What JPA/Hibernate generates:

select
    organizati0_.id as id1_3_0_,
    -- removed all the columns to keep only the relevant parts
from
    application_organization organizati0_
left outer join organization_internet_domain_categorized internetdo1_ on
    organizati0_.application.internet_domain_id = internetdo1_.internet_domain_id
    and organizati0_.organization_id = internetdo1_.organization_id
left outer join internet_domain internetdo2_ on
    internetdo1_.internet_domain_id = internetdo2_.id
left outer join Organization organizati3_ on
    internetdo1_.organization_id = organizati3_.id
where
    organizati0_.id =?

organizati0_.application.internet_domain_id is not a valid reference.

Upvotes: 0

Views: 687

Answers (1)

Christian Beikov
Christian Beikov

Reputation: 16400

The mapping

    @JoinColumns({
            @JoinColumn(name = "organization_id", referencedColumnName = "organization_id", insertable = false, updatable = false),
            @JoinColumn(name = "application.internet_domain_id", referencedColumnName = "internet_domain_id", insertable = false, updatable = false)
    })
    private InternetDomainCategory internetDomainCategory;

is invalid. You can not refer to other tables in the join columns annotation.

It's also unnecessary to do so, as you can access this InternetDomainCategory by using application.getInternetDomainCategory().

Upvotes: 0

Related Questions