具有cascade=CascadeType.DETACH的OneToOne映射


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,之后会发生什么。

  1. 如果我必须这样做才能工作,我需要做什么调整。

  2. 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);    
}

最新更新