class Person {
@Id
private Long id;
@Column(name = "NAME");
private String name;
@OneToOne(mappedBy="person", cascade = CaseCadeType.DETACH)
private SocialId socialId;
}
class SocialId {
@Id
private Long id;
@Column(name = "NAME");
private String name;
@Column(name ="PERSON_ID")
private Long personId;
@OneToOne(cascade = CaseCadeType.DETACH)
@JoinColumn(name = "PERSON_ID", referencedColumnName = "id", insertable = false, updatable = false)
private Person person;
}
@Transactional
public void customSave(Person person) {
SocailId socialId = person.getSocialId();
// Person Save
personrepo.save(person);
socialId.setPersonId(person.getId());
// SocailId Save
socialIdRepo.save(socialId);
}
我有上面的案例,行吗。请不要考虑任何事情,只是为了追踪目的,我创建了两个实体。
我的问题是1.我已经为customSave声明了一个@Transactional,之后会发生什么。
如果我必须这样做才能工作,我需要做什么调整。
p.S:我解决了这个问题。我想知道以上声明中的所有错误是对的。如果它是正确的,如何以及为什么。
我看不到有任何cascade = CaseCadeType.DETACH
的使用,相反,您可以使用cascade = CaseCadeType.ALL
,也可以删除insertable = false, updatable = false
,而不是orphanRemoval = false
,默认情况下为false。
所以可以有没有SocialId的Person,在这种情况下,您的SocialId将设置为null,您可以稍后附加它(我相信您希望social_id在Person中为FK,而不是SocialId实体/表中的Person_id(
所以你修改的代码将如下
@Entity
@Table(name = "PERSON")
class Person {
@Id
private Long id;
@Column(name = "NAME");
private String name;
@OneToOne(fetch = FetchType.LAZY, orphanRemoval = false, mappedBy = "person")
private SocialId socialId;
}
@Entity
@Table(name = "SOCIAL_ID")
class SocialId {
@Id
private Long id;
@Column(name = "NAME");
private String name;
@OneToOne
@JoinColumn(name = "PERSON_ID", foreignKey = @ForeignKey(name = "FK_PERSON_ID"))
private Person person;
}
您的DaoMethod,您不必将两者分别保存,因为它们是相互映射的。如果您将set social id保存为Person并保存Person,则socialid将自动由JPA保存。
@Transactional
public void customSave(Person person) {
SocailId socialId = person.getSocialId();
// Person Save
personrepo.save(person);
socialId.setPersonId(person.getId());
// SocailId Save
socialIdRepo.save(socialId);
}