【发布时间】:2021-08-05 18:25:36
【问题描述】:
所以我的包中有以下类
类存储数据:
@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;
}
所以现在我的数据库中的源表中已经有一个条目:
| source_type | id | ad_id | data_id |
|---|---|---|---|
| ADS | 1 | Ads12 | 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 生成新行如下
| source_type | id | ad_id | data_id |
|---|---|---|---|
| ADS | 1 | Ads12 | 1 |
| ADS | 2 | Ads1234 | 1 |
我无法弄清楚为什么会这样。是因为 StoredSource 是一个抽象类吗?请帮帮我。
【问题讨论】:
-
您是否需要StoredSource 中的StoredData 和StoredData 中的StoredSource 映射?你能删除其中一个吗?如果这不可能,请尝试从 StoredSource 的 StoredData 成员中删除 cascade = CascadeType.ALL。
-
是的,我需要两个映射。我也尝试删除 cascade = CascadeType.ALL 但仍然是同样的问题。
标签: java hibernate jpa hibernate-mapping