我正在使用春季数据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(?);
但是,在创建时我只有所有者。
我想在创建时单独设置所有者_id,但是要建立关联(查询),我将其映射到具体类(人)。
我尝试了这个
class Contact{
@Column("owner_id")
private String ownerId;
@ManyToOne
@JoinColumn("owner_id")
private Person pwner;
}
但是,它的投掷错误重复引用了所有者。
我不想在创建联系时查询所有人的表格,并将"人"引用设置为设置。
我想在插入和所有者参考时使用所有者_ID,我可能会获得所有者详细信息以提供给予联系人。如何解决此问题。
预先感谢。
您需要用户。该用户在数据库中。JPA允许将数据库表映射到实体。您拥有此用户的ID。所以...只需使用JPA API获取用户:
contact.setOwner(entityManager.find(User.class, userId));
或
contact.setOwner(entityManager.getReference(User.class, userId));
第一个实际上从数据库中获取用户的详细信息,因此检查了用户的确存在。
第二个假设用户存在,ANS只是创建了一个懒惰的初始化代理,而无需查询数据库。
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
对象可以帮助我获取给定联系方式的所有者详细信息(如果需要的话)。这种方法我可以在不使用findOne(id)
或getOne(id)
的情况下达到要求。