Hibernate 映射一个 Map (HashMap) 总是添加新行而不是更新
Hibernate mapping a Map (HashMap) always add new row instead to update
我正在尝试创建一个实体来支持本地化。
实体 - RoadAssistance
@Entity
@DynamicUpdate
public class RoadAssistance{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
/* Localization ....*/
@MapKeyColumn(name = "locale")
@MapKeyType(value = @Type(type = "java.util.Locale"))
@OneToMany(cascade = CascadeType.ALL, mappedBy = "roadAssistance")
Map<Locale, RoadAssistanceI18n> roadAssistanceI18n = new HashMap<>();
/*Map Helper method for locale*/
public RoadAssistanceI18n getRoadAssistanceI18n(Locale locale) {
return roadAssistanceI18n.get(locale);
}
/// GETTERS AND SETTRE // W/O equals and hashCode implementation..
}
实体 - RoadAssistanceI18n
@Entity
@Table(name = "road_assistance_i18n")
public class RoadAssistanceI18n{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
private String address;
@Lob
private String description;
@ManyToOne
RoadAssistance roadAssistance;
/// GETTERS AND SETTRE // W/O equals and hashCode implementation..
}
在视图 (Thymeleaf) 中,我有以下
<div class="col-sm-8 offset-sm-2 mt-3">
<textarea data-th-field="*{roadAssistanceI18n[__${#locale}__].description}" rows="10" class="form-control" id="description" name="description"></textarea>
</div>
为了持久性,我使用了 Spring 数据。
一切都很完美,我可以 add/view 用不同的语言进行描述并且它有效。问题是,当我更新描述时,在数据库 table 中,每次更新都会得到新行。我正在使用来自持久实体的引用并从那里覆盖地图..
从你的 HTML 我看不到你发送当前编辑实体的 ID 的部分。问题可能是您正在保留一个 ID 为 null 的 RoadAssistanceI18n 实体,这将导致在数据库中产生一个新条目。如果您正确设置了 id,Hibernate 将更新值而不是创建新条目。
我正在尝试创建一个实体来支持本地化。
实体 - RoadAssistance
@Entity
@DynamicUpdate
public class RoadAssistance{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
/* Localization ....*/
@MapKeyColumn(name = "locale")
@MapKeyType(value = @Type(type = "java.util.Locale"))
@OneToMany(cascade = CascadeType.ALL, mappedBy = "roadAssistance")
Map<Locale, RoadAssistanceI18n> roadAssistanceI18n = new HashMap<>();
/*Map Helper method for locale*/
public RoadAssistanceI18n getRoadAssistanceI18n(Locale locale) {
return roadAssistanceI18n.get(locale);
}
/// GETTERS AND SETTRE // W/O equals and hashCode implementation..
}
实体 - RoadAssistanceI18n
@Entity
@Table(name = "road_assistance_i18n")
public class RoadAssistanceI18n{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
private String address;
@Lob
private String description;
@ManyToOne
RoadAssistance roadAssistance;
/// GETTERS AND SETTRE // W/O equals and hashCode implementation..
}
在视图 (Thymeleaf) 中,我有以下
<div class="col-sm-8 offset-sm-2 mt-3">
<textarea data-th-field="*{roadAssistanceI18n[__${#locale}__].description}" rows="10" class="form-control" id="description" name="description"></textarea>
</div>
为了持久性,我使用了 Spring 数据。 一切都很完美,我可以 add/view 用不同的语言进行描述并且它有效。问题是,当我更新描述时,在数据库 table 中,每次更新都会得到新行。我正在使用来自持久实体的引用并从那里覆盖地图..
从你的 HTML 我看不到你发送当前编辑实体的 ID 的部分。问题可能是您正在保留一个 ID 为 null 的 RoadAssistanceI18n 实体,这将导致在数据库中产生一个新条目。如果您正确设置了 id,Hibernate 将更新值而不是创建新条目。