【问题标题】:Create instance of the Entity in the Many side of ManyToOne Relationship在 ManyToOne 关系的多方中创建实体的实例
【发布时间】:2017-09-02 14:58:48
【问题描述】:

我正在使用 Spring Data JPA
我有以下实体

人物实体

class Person{

private String id;

@OneToMany(mappedBy="owner")
private List<Contact> contacts;
...

}

联系实体

class Contact{

private String id;

@ManyToOne
@JoinColumn(name="owner_id")
private Person owner;
...

}

当我想创建联系人实例时,我对如何映射所有者详细信息感到困惑。

Contact contact = new Contact();
contact.setOwner(?);

但在创建时,我将只有 owner_id。
我想在创建时单独设置 owner_id,但是为了有关联(在查询时),我已将其映射到具体类(Person)。

我试过了

class Contact{

@Column("owner_id")
private String ownerId;
@ManyToOne
@JoinColumn("owner_id")
private Person pwner;

} 

但它的抛出错误重复引用 owner_id。

我不想使用 owner_id 查询 Person Table 并在创建联系人时将“Person”引用设置为 set。

我想在插入时使用 owner_id 和所有者引用,通过它我可以获得给定联系人的所有者详细信息。 如何解决这个问题。

提前致谢。

【问题讨论】:

    标签: java hibernate orm spring-data-jpa hibernate-onetomany


    【解决方案1】:

    您需要一个用户。此用户在数据库中。 JPA 允许将数据库表的行映射到实体。您有此用户的 ID。所以...只需使用 JPA API 获取用户:

    contact.setOwner(entityManager.find(User.class, userId));
    

    contact.setOwner(entityManager.getReference(User.class, userId));
    

    第一个实际上是从数据库中获取用户的详细信息,从而检查用户是否确实存在。

    第二个假设用户存在,并且只是创建一个延迟初始化的代理,而不查询数据库。

    【讨论】:

    【解决方案2】:
    class Person {
    
       private String id;
    
       @OneToMany(mappedBy="owner")
       private List<Contact> contacts;
    
    }
    
    class Contact {
    
       private String id;
    
       @ManyToOne(fetch = FetchType.Lazy)
       @JoinColumn(name="owner_id", nullable=false,updatable=false)
       private Person owner;
    
       @Column("owner_id")
       private String ownerId;
    
    }
    

    这实际上允许我在创建联系人对象时使用ownerId:String 字段,owner:Owner 对象帮助我获取给定联系人详细信息的所有者详细信息(如果需要)。这样我可以在不使用 @987654324 的情况下实现我的要求@ 或getOne(id)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多