Individual base type mappings to a single class in Hibernate

So the situation is this: there is an entity that must be associated with a dictionary. Imagine the following structure

create table Address (
    addressId bigint not null,
    addressLine1 varchar(255),
    city varchar(255),
    country varchar(255),
    state varchar(255),
    zipCode varchar(255),
    primary key (addressId)
)

create table STATES_DICT (
    state_code varchar(255),
    state_fullname varchar(255), 
    primary key (state_code)
)

I want to match both ADDRESS and STATE_DICTIONARY in the same object.

@Entity
@Table(name = "ADDRESS")
public class Address implements Serializable {

    @Id
    @Column(name = "ADDRESSID")
    private int addressId;

    @Column(name = "ADDRESSLINE1")
    private String addressLine1;

    @Column(name = "STATE")
    private String state;

    //??? annotations
    private String fullStateName;

    @Column(name = "ZIPCODE")
    private String zipCode;

    @Column(name = "CITY")
    private String city;

    @Column(name = "COUNTRY")
    private String country;
    //... getters and setters
}

For pure SQL, I ran

select a.ADDRESSID, a.ADDRESSLINE1, a.CITY, a.ZIPCODE, a.STATE, 
    d.STATE_FULLNAME, a.COUNTRY 
from ADDRESS a, STATES_DICT d where a.STATE = d.STATE_CODE

but I am having serious problems displaying it using JPA.

  • I cannot use @SecondaryTable because tables are not displayed with primary keys
  • The best I could get was:
    @ElementCollection
    @JoinTable(name="STATES_DICT", 
            joinColumns=@JoinColumn(name="STATE_CODE", referencedColumnName="STATE"))
    @Column(name = "STATE_FULLNAME")
    private Collection<String> fullStateName;

Downside - matching is always one-to-one, and assembly leads to confusion, and the ratio is more from one to one (many-to-one), and not one-to-many.

? @ElementCollection ? @ElementCollection . fullStateName ADDRESS - .

: * , . * , * , . , @OneToOne


@SecondaryTable - .

@Entity
@Table(name = "ADDRESS")
@SecondaryTable(name="STATES_DICT", 
        pkJoinColumns=@PrimaryKeyJoinColumn(columnDefinition="STATE_CODE", referencedColumnName="STATE"))
public class Address implements Serializable {

    @Id
    @Column(name = "ADDRESSID")
    private int addressId;

    @Column(name = "ADDRESSLINE1")
    private String addressLine1;

    @Column(name = "STATE")
    private String state;

    @Column(table="STATES_DICT", name = "STATE_FULLNAME")
    private String fullStateName;

    @Column(name = "ZIPCODE")
    private String zipCode;

    @Column(name = "CITY")
    private String city;

    @Column(name = "COUNTRY")
    private String country;

    //... getters and setters
}

: : org.hibernate.AnnotationException: SecondaryTable JoinColumn


- ( , , ). (@ManyToOne, @OneToOne) @JoinColumn - . @JoinColumn , @Column. .

- , . @Column

+5
3

@Embeddable State, , . , ?

0

@pkJoinColumns :

@PrimaryKeyJoinColumn(name="STATE_CODE", referencedColumnName="STATE")

, @SecondaryTable . . .

0

2601805 ,

@PrimaryKeyJoinColumn(name="STATE_CODE", referencedColumnName="STATE")

, , , STATES_DICT.

, JPA, @SecondaryTable @Embeddable - @ElementCollection, @OneToOne

Also see this blog, e.g. http://www.bagdemir.com/2013/03/03/mapping-embeddable-objects-whichve-no-identities-using-multiple-tables-with-jpahibernate/

0
source

All Articles