Как объединить поля двух таблиц с помощью Hibernate?

У меня есть две таблицы и соответствующее сопоставление Java.

CREATE TABLE country (
    code VARCHAR(3) PRIMARY KEY NOT NULL,
    name VARCHAR(100) NOT NULL
);


CREATE TABLE user (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    country_code VARCHAR(3),
    FOREIGN KEY ( country_code ) REFERENCES country ( code )
);

Вот мои объекты Java. Страна POJO:

@Entity
@Table(name = "country")
public class Country {

    @Id
    @Column (name = "code")
    private String code;

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

И пользователь POJO:

@Entity
@Table(name = "user")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

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

    @Column(name = "country_code")
    private String countryCode;

Вопрос в том, как я могу присоединиться к Contry.code к User.countryCode в Hibernate, используя аннотацию? Когда я создаю объект пользователя с помощью Hibernate, мне нужно автоматически связать эти два поля (код и код страны).


person user3279337    schedule 11.03.2014    source источник


Ответы (1)


Вам нужно @OneToMany сопоставление от Country к User объекту и соответствующее @ManyToOne сопоставление от User к Country:

@Entity
@Table(name = "country")
public class Country {

    @Id
    @Column (name = "code")
    private String code;

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

    @OneToMany(mappedBy = "country")
    private Set<User> users;
}

@Entity
@Table(name = "user")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

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

    @ManyToOne
    @JoinColumn(name = "country_code")
    private Country country;
}
person Rohit Jain    schedule 11.03.2014
comment
Но мне нужен только объект CountryCode, а не объект Country. - person user3279337; 11.03.2014
comment
@user3279337 user3279337 Вот как вы создаете сопоставление между объектами в спящем режиме. Вы можете получить countryCode по ссылке country. - person Rohit Jain; 11.03.2014
comment
@user3279337 user3279337 Кстати, это просто очень простое сопоставление. Есть еще много вариантов, которые вы можете дать. Возможно, вы захотите просмотреть документацию по спящему режиму для получения дополнительной информации об этом. - person Rohit Jain; 11.03.2014