我正在以一对一的关系经历一些奇怪的行为。我在两个实体之间有一对一的关系:GeographicalLocation和IdentityDocument。在这种关系中,GeographicalLocation是父实体。该关系由IdnetityDocument实体拥有。这是JPA的实现:
@Entity
@Table(name="GEOGRAPHICAL_LOCATION")
public class GeographicalLocation implements Serializable
{
private Long id;
...
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "GEOGRAPHICAL_LOCATION_ID")
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
...
}
@Entity
@Table(name="IDENTITY_DOCUMENT")
public class IdentityDocument implements Serializable
{
private Long id;
...
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "IDENTITY_DOCUMENT_ID")
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
@OneToOne
@MapsId
@JoinColumn(name = "IDENTITY_DOCUMENT_ID")
public GeographicalLocation getPlaceOfIssue()
{
return placeOfIssue;
}
public void setPlaceOfIssue(GeographicalLocation placeOfIssue)
{
this.placeOfIssue = placeOfIssue;
}
这将生成以下数据库模型:
GeographicalLocation geographicalLocation = ...;
IdentityDocument identityDocument = ...;
geographicalLocationFacade.save(geographicalLocation);
identityDocument.setPlaceOfIssue(geographicalLocation);
identityDocumentFacade.save(identityDocument);
在GEOGRAPHICAL_LOCATION表中创建两条记录,而在IDENTITY_DOCUMENT中创建一条记录。
似乎发生的事情是,持久化后代实体会在主表中创建一条记录,而持久化该后代实体会在主表中正确创建一条记录,而在后代表中则没有任何记录。我尝试使用不同的场景并四处搜寻,但是我仍然不明白这里可能会发生什么。 在此先感谢可以遮挡某些光线的人。 亲切的问候, 尼古拉斯
答案 0 :(得分:0)
这是我也曾经历过的冬眠中的错误。发现@GeneratedValue(strategy = GenerationType.IDENTITY)
是原因。如果您使用AUTO而不是IDENTITY,那么它将起作用,但是我们使用IDENTITY的主要原因是为了防止休眠状态的额外选择查询确定id的最大值,将其留给数据库,这将是您的权衡要做。