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;
private String fullStateName;
@Column(name = "ZIPCODE")
private String zipCode;
@Column(name = "CITY")
private String city;
@Column(name = "COUNTRY")
private String country;
}
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;
}
:
: org.hibernate.AnnotationException: SecondaryTable JoinColumn
- ( , , ). (@ManyToOne, @OneToOne) @JoinColumn - . @JoinColumn , @Column. .
- , . @Column