首页 > 解决方案 > @OneToOne 与三个表之间的共享密钥

问题描述

我有三个共享相同主键的实体。AccountProvider实体之间是双向的一对一关系,之前命名的实体共享它们的主键,但同时Provider实体与GlobalRating实体共享主键,这里是单向关系它们之间。我必须说我正在使用休眠和 MySQL 作为数据库:

账户实体:

@Entity
@Table(name="account")
@Getter
@Setter
@JsonIdentityInfo(
          generator = ObjectIdGenerators.PropertyGenerator.class, 
          property = "email")
public class Account implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO, generator="native")
    @GenericGenerator(name = "native", strategy = "native")
    @Column(name="id")
    private int id;

    @OneToOne(mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    private Provider provider;
}

提供者实体:

@Entity
@Table(name="provider")
@Getter
@Setter
@JsonIdentityInfo(
          generator = ObjectIdGenerators.PropertyGenerator.class, 
          property = "providerId")
public class Provider implements Serializable, Comparable<Provider>{

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="pk_account$provider")
    @GeneratedValue(generator="native")
    @GenericGenerator(name="native", strategy="foreign",parameters=@Parameter(name="property", value="account"))
    private int providerId;

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    private Account account;

    @OneToOne(fetch=FetchType.LAZY, cascade = CascadeType.ALL, optional = false)
    @PrimaryKeyJoinColumn
    private GlobalRating globalRating;
}

GlobalRating 实体:

@Entity
@Table(name="global_rating")
@Getter
@Setter
public class GlobalRating implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="pk_provider$global_rating")
    @GeneratedValue(generator="native")
    @GenericGenerator(name="native", strategy="foreign",parameters=@Parameter(name="property", value="globalRating"))
    private int globalRatingId;
}

我遇到的问题是在使用ProviderGlobalRating创建帐户时。我确信AccountProvider之间的双向映射有效,但问题在于实体Provider和实体GlobalRating的映射。我已经尝试了几种方法,但它不起作用。那么,这种情况如何在休眠中正确映射?

我很感激你能帮我解决这个问题。

标签: javahibernatejpahibernate-mappingone-to-one

解决方案


推荐阅读