【问题标题】:unable to understand mappedby无法理解mappedby
【发布时间】:2017-04-29 18:34:33
【问题描述】:

我创建了两个实体客户和客户记录。

//customer class
@OneToOne
@JoinColumn(name="CUSTREC_ID", unique=true)
CustomerRecord customerRecord;

//customer record class
@OneToOne(mappedBy="customerRecord")
Customer customer;

mappedBy 的目的是表明所有者存在于关系的另一端。当我看到我的示例并看到 mappedBy 用作 mappedBy="customerRecord" 时,我发现它与 mappedBy 的定义相矛盾,因为映射是在关系的客户端完成的,并且 mappedBy 中提到的属性值是客户记录。如果我遵循 mappedBy 的定义,那么它应该是 mappedBy="customer" 因为那是持有关系的一方。那么我的理解有什么问题呢?

Queries generated:
Hibernate: insert into CustomerRecord (customerRecordName, CustomerRecordId) values (?, ?)
Hibernate: insert into Customer (customerName, CUSTREC_ID, customerId) values (?, ?, ?)

【问题讨论】:

  • mappedBy 期望另一个类中的 property / field 的名称,它映射关联。 Customer 中的属性确实命名为customerRecord。例如,您需要意识到 Customer 可能有一个 currentCustomerRecord 和一个 oldCustomerRecord,两者都是 CustomerRecord 类型。所以指定类名是不够的。字段的名称对于知道哪个映射关联是必要的。

标签: hibernate mappedby


【解决方案1】:

是的,mappedBy 引起了很多混乱,我认为是因为 Hibernate 进行的推理。这是一个简单的用例,与您的非常相似,但使用的是一对多关系......即一个用户可能有多个帐户,但一个帐户可能只有一个用户:

public class User {
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    @OneToMany(fetch = FetchType.LAZY, mappedBy="user")
    private List<Account> accounts = new ArrayList<Account>();
    public List<Account> getAccounts() {
        return Accounts;
    }
    ...
}

public class Account {
    ...
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
    ...
}

在某些时候,User getAccounts() 方法被调用。 Hibernate 说,“好吧,我看到 getAccounts 返回 Account 对象,我看到我们在 User 与 Accounts 中定义了 OneToMany 连接关系,但我需要知道我应该使用 Account 中的哪一列来连接这两个对象(表)。”

@mappedBy 告诉 Hibernate,将此类(用户模型“id”字段)中的 @Id 值与远程类(帐户模型“用户”字段)中的 @mappedBy 值连接起来。

如果我可以帮助进一步澄清,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2014-01-03
    • 2020-04-17
    • 2017-10-05
    • 2020-08-26
    • 2011-04-12
    相关资源
    最近更新 更多