【问题标题】:Hibernate @ManyToOne and additional mapping for target's idHibernate @ManyToOne 和目标 id 的附加映射
【发布时间】:2016-06-27 07:50:23
【问题描述】:

我看到了一个单向 @ManyToOne 映射示例,其中包含目标 id 的附加映射,例如:

@Entity
public class Person {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "company_id")
    private Company company;

    @Column(name = "company_id", insertable = false, updatable = false)
    private Long companyId;

    ...
}

我不明白为什么我们需要为 companyId 进行额外的映射。有人能解释一下这个技巧吗?

【问题讨论】:

  • 如前所述,companyId 字段不是必需的。但是,如果您想直接访问标识符,而不需要额外的例如,它可能会很有用。 getCompany().getId() 调用,可能为空。据我所知,附加标识符字段并未被广泛使用。

标签: hibernate jpa


【解决方案1】:

companyId 的附加映射是可选的,取决于您的业务逻辑,而不是 JPA 的必需项。 当您只需要显示 companyId 然后 getCompanyId() 将比 getCompany().getId() 更快时,这可能会很好。

【讨论】:

    【解决方案2】:

    我想参考我的一个答案 -> https://stackoverflow.com/a/35549928/5909679

    首先,您的Person-entity 和Company-entity 需要某种ID...此外,您可以拥有单向OneToMany,但ManyToOne 需要双向关系。

    您的字段companyId 根本不需要,不会对您的ManyToOne 产生任何影响。只需要 JoinColumn 注释,它在连接表中声明您想要的列名。按以下方式进行:

    在你的Person-entity:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private Integer id;
    
    @ManyToOne //FetchType.LAZY is by default
    @JoinColumn(name = "company_id")
    private Company company;
    

    在你的Company-entity:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private Integer id;
    
    @OneToMany(mappedBy = "company")
    private List<Person> persons;
    

    如果您想更好地控制连接表的命名,请将其声明如下:

    @ManyToOne
    @JoinTable(name="desired_table_name", joinColumns={@JoinColumn(name="person_id", referencedColumnName="id")}, inverseJoinColumns={@JoinColumn(name="company_id", referencedColumnName="id")})
    private Company company;
    

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      相关资源
      最近更新 更多