首页 > 解决方案 > Hibernate 更新调用在 @OneToOne 映射中生成新行

问题描述

所以我的包中有以下类

类存储数据:

@Data
@Entity
@ToString
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Table(name = "data")
@Builder
public class StoredData {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false, updatable = false)
private long id;

@Column(name = "data_id", nullable = false)
private String dataId;

@OneToOne(mappedBy = "data", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private StoredSource source;
}

类存储源:

@Data
@Entity
@EqualsAndHashCode(exclude = {"id","data"})
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "source_type")
@Table(name = "source")
public abstract class StoredSource {
 
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private long id;

@Enumerated(EnumType.STRING)
@Column(name = "source_type", insertable = false, updatable = false)
private SourceType sourceType;

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "data_id", referencedColumnName = "id", nullable = false)
private StoredData data;

}

现在还有 2 个类扩展了 StoredSource 类:

@Data
@Entity
@ToString
@EqualsAndHashCode(callSuper = true)
@DiscriminatorValue(SourceType.ADS_TEXT)
public class StoredAdSource extends StoredSource {

@Column(name = "ad_id")
private String adId;
 
}

@Data
@Entity
@ToString
@EqualsAndHashCode(callSuper = true)
@DiscriminatorValue(SourceType.OFFERS_TEXT)
public class StoredOfferSource extends StoredSource {

@Column(name = "offer_id")
private String offerId;

}

所以现在我已经在源表中的数据库中有一个条目:

源类型 ID ad_id data_id
广告 1 广告12 1

但是当我尝试对 storedData 对象进行更新时:

StoredData storedData = getEntryFromDb();    
storedData.setSource(newData.getSource());
storedData.getSource().setData(storedData);
where newData is a StoredData type of object and only the ad_id of its source is changed to Ads1234.

Hibernate 生成新行如下

源类型 ID ad_id data_id
广告 1 广告12 1
广告 2 广告1234 1

我无法弄清楚为什么会这样。是因为 StoredSource 是一个抽象类吗?请帮帮我。

标签: javahibernatejpahibernate-mapping

解决方案


推荐阅读