【发布时间】:2020-01-09 14:28:59
【问题描述】:
我想要的行为:
Make
ID | City | Vers
1 Jose S_5
MakeConfiguration
MakeID | Something | Vers
1 nada S_5
当我得到这个实体(使用带有一些自定义 @Query 的 spring data jpa)时,一切正常。
当我尝试发布(完全相同的实体)时,我想要以下内容:
Make
ID | City | Vers
1 Jose S_5
1 Jose S_6
MakeConfiguration
MakeID | Something | Vers
1 nada S_5
1 nada S_6
但我得到的是这样的:
Make
ID | City | Vers
1 Jose S_5
1 Jose S_6
MakeConfiguration
MakeID | Something | Vers
1 nada S_6
(请注意在 MakeConfiguration 中没有创建新记录) 正在显示的 SQL 正在将新记录插入 Make,并使用新版本更新 MakeConfiguration 中的记录。如果我更改任何其他 @Id 注释值(在这种情况下是某物),那么它会正确插入一条新记录。似乎hibernate不尊重版本上的@Id注解。
我有以下(JPA/Hibernate 实体)
@Entity
@IdClass(MakeId.class)
public class Make {
@Id
@Column(name="MAKE_ID")
private String makeUuid;
@Id
private String city
@Id @Column(name = "MAKE_ID_VERSION")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "version_seq")
@GenericGenerator(
name = "version_seq", strategy = "com.me.VersionIdGenerator"
)
private String makeIdVersion;
@OneToMany(fetch = FetchType.EAGER)
@JoinColumns( {
@JoinColumn(name = "clientProgramUuid", referencedColumnName = "MAKE_ID"),
@JoinColumn(name = "clientUuidVersion", referencedColumnName = "MAKE_ID_VERSION")
})
private List<MakeConfiguration> makeConfigurations;
}
@Entity
@IdClass(MakeConfigurationId.class)
public class MakeConfiguration {
@Id
private String makeConfigurationUuid
@Id
private String something
@Id
private String makeIdVersion;
}
为便于阅读,省略了 IdClass、getter、setter。 VersionIdGenerator 按顺序生成下一个版本(假设为 S_1、S_2...S_N)。
我也总是在 Make entity 上调用 entitymanager.persist。
我已经尝试了几件事来让它工作(双向等)但没有运气。我认为我需要强制从 Make 生成的内容中检索版本。
【问题讨论】:
-
看起来您的交易有问题...您是否获取版本
5_5的MakeConfiguration并对其进行修改?如果是这样:这一切都发生在一笔交易中吗?如果是:实体仍被附加并因此得到更新。如果您使用@Transactional(propagation = Propagation.REQUIRES_NEW)注释获取MakeConfiguration的方法,这可能是可以避免的 -
不,我唯一的交互是通过rest API(get + post),所以什么都不应该附加
-
这里似乎有一个误解...在您的应用程序中,您需要有一些代码(可能是
Repository)与数据库交互。一定会涉及到一些交易。没有事务 = 没有数据库交互。