java - 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 是一个抽象类吗?请帮帮我。
解决方案
推荐阅读
- c# - 从 ASP .NET 应用程序批处理到事件中心
- java - 圆到圆矢量变换
- jquery - jQuery Datepicker - 选择月份或年份后运行函数
- r - 在for循环R中生成随机数
- c# - 在 C#.NET 的帮助下将数据从我的计算机连接并插入到服务器的 MySQL DB 表中
- api - 仅限于 100 个结果 TFS api
- powershell - 使用 PowerShell 和 [ADSI] 远程设置 Windows 本地管理员密码
- algorithm - 在 O(1) 时间内找到数组中的 k 个最大元素
- sql - 在 Notepad++ 中从 PL/SQL 文件中提取所有对象名称
- python - Pandas 中的分箱数据