@OneToOne单向映射中实体的映射中重复的列

时间:2019-03-05 20:17:40

标签: java database hibernate spring-data-jpa

考虑以下数据库结构

我需要实现单向一对一映射(简化结构):

@Entity
@Table(name = "entity")
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToOne
    @JoinColumn(name = "customer_info", nullable = false)
    private CustomerInfo customerInfo;

    @OneToOne
    @JoinColumn(name = "customer_credentials", nullable = false)
    private CustomerCredentials customerCredentials;

    //  getter, setters etc
}

@Entity
@Table(name = "customer_info")
public class CustomerInfo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    //  getter, setters etc
}

@Entity
@Table(name = "customer_credentials")
public class CustomerCredentials {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    //  getter, setters etc
}

但是以某种方式休眠无法区分那些联接来自不同的表并抛出这样的错误:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: com.example.Customer column: customer_id (should be mapped with insert="false" update="false")

重要通知:我不想使用@OneToOne(mappedBy = "customer"),因为我需要级联保存功能

1 个答案:

答案 0 :(得分:1)

您可以使用@JoinTable而不是@JoinColumn来解决您的问题:

@Entity @Table(name = "entity") public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToOne(cascade = CascadeType.ALL, targetEntity = CustomerInfo.class)
    @JoinTable(name = "customer_info", inverseJoinColumns = {@JoinColumn(name = "customer_id", nullable = false)})
    private CustomerInfo customerInfo;

    @OneToOne(cascade = CascadeType.ALL, targetEntity = CustomerCredentials.class)
    @JoinTable(name = "customer_credentials", inverseJoinColumns = {@JoinColumn(name = "customer_id", nullable = false)})
    private CustomerCredentials customerCredentials;

    //  getter, setters etc }

@Entity @Table(name = "customer_info") public class CustomerInfo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    //  getter, setters etc }

@Entity @Table(name = "customer_credentials") public class CustomerCredentials {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    //  getter, setters etc }

您可以将层叠策略更改为所需的任何策略。我只是以CascadeType.ALL为例。