我使用的是spring boot starter数据jpa 1.5.1。内部使用hibernate core 5.0.11的版本。最终的
我的实体看起来像这样:
区域
@Entity
@Table(name = "AREA")
@EntityListeners(AuditingEntityListener.class)
public class AreaDto {
@Id
@Column(name = "AREA_ROWID")
private String areaRowId;
@OneToMany(cascade = CascadeType.DETACH)
@JoinColumn(name = "AREA_ROWID")
private Collection<FestivalDto> festival;
@OneToMany(cascade = CascadeType.DETACH, mappedBy = "area")
private Collection<ActionDto> actions;
@OneToMany(fetch = FetchType.LAZY)
@JoinTable(name = "FESTIVAL", joinColumns = {
@JoinColumn(name = "AREA_ROWID", referencedColumnName = "AREA_ROWID")}, inverseJoinColumns = {
@JoinColumn(name = "FESTIVAL_ROWID", referencedColumnName = "FESTIVAL_ROWID")})
private Collection<ActionDto> festivalActions;
}
节日的
@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "FESTIVAL")
public class FestivalDto {
@Id
@Column(name = "FESTIVAL_ROWID")
@GeneratedValue(generator = "FESTIVAL_ROWID_SEQ")
private Long festivalRowId;
@ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.LAZY, optional = true)
@JoinColumn(name = "AREA_ROWID")
private AreaDto area;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "festival")
private Collection<ActionDto> actions = Lists.newArrayList();
}
行动
@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "ACTION")
public class ActionDto implements Serializable {
...
@Id
@Column(name = "ACTION_ID")
@GeneratedValue(generator = "ACTION_ID_SEQ")
private Long actionId;
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@ManyToOne(cascade = DETACH, fetch = FetchType.LAZY)
@JoinColumn(name = "FESTIVAL_ROWID")
private FestivalDto festival;
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@ManyToOne(cascade = DETACH, fetch = FetchType.LAZY)
@JoinColumn(name = "AREA_ROWID")
private AreaDto area;
}
我试图理解以下观点:
>
我的映射是准确的,还是应该使用多重映射来处理这种关系,因为一个区域可以有多个节日,每个节日可以有多个动作
背景:如果我将fetch类型从LAZY改为eanger,就会出现以下错误。希望能够理解这种行为,从而在修复过程中获得一些信心。我读了这么多,而且有错误
org.hibernate.HibernateException: More than one row with the given identifier was found: data.dto.ActionDto@280856b5
这种映射没有多大意义。您不能以这种方式映射节日活动,因为无法通过这种映射正确地保持状态。此外,区域中的
节日
也应通过节日
中的区域
进行映射。请尝试以下方法:
@Entity
@Table(name = "AREA")
@EntityListeners(AuditingEntityListener.class)
public class AreaDto {
@Id
@Column(name = "AREA_ROWID")
private String areaRowId;
@OneToMany(cascade = CascadeType.DETACH, mappedBy = "area")
private Collection<FestivalDto> festival;
@OneToMany(cascade = CascadeType.DETACH, mappedBy = "area")
private Collection<ActionDto> actions;
public Collection<ActionDto> getFestivalActions() {
return festival.stream().flatMap(f -> f.actions.stream()).collect(Collectors.toList());
}
}
@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "FESTIVAL")
public class FestivalDto {
@Id
@Column(name = "FESTIVAL_ROWID")
@GeneratedValue(generator = "FESTIVAL_ROWID_SEQ")
private Long festivalRowId;
@ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.LAZY, optional = true)
@JoinColumn(name = "AREA_ROWID")
private AreaDto area;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "festival")
private Collection<ActionDto> actions = Lists.newArrayList();
}
@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "ACTION")
public class ActionDto implements Serializable {
...
@Id
@Column(name = "ACTION_ID")
@GeneratedValue(generator = "ACTION_ID_SEQ")
private Long actionId;
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@ManyToOne(cascade = DETACH, fetch = FetchType.LAZY)
@JoinColumn(name = "FESTIVAL_ROWID")
private FestivalDto festival;
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@ManyToOne(cascade = DETACH, fetch = FetchType.LAZY)
@JoinColumn(name = "AREA_ROWID")
private AreaDto area;
}
有两张数据表,通过第三张数据表来表示关联关系,我们称之为多对多的映射 如上图,通过一个中间数据表的两个字段,分别指向两个对象的主键,可以实现多对多映射。所以,Pet.foods(一个 List<Food>) 或者 Food.pets(一个List<Pet>)就是多对多映射。 在 POJO 中配置多对多映射 在 POJO 类中字段中增加注解 @ManyMany: @Table("t_food")
我有一个选择类型的表单填充从以下数组: 如果此日期在具有相同时隙的数据库中已知,则必须过滤掉此时隙。现在他一天只取一个值。 例如,我有一个数组: 在那里,我想用这个函数过滤掉以下值: 因此,我预计“17:00”和“17:30”将不再可见。如你所见,只有17:00不再可用。如果我有1个值,它就会工作。有人能告诉我我做错了什么吗?
主要内容:@ManyToMany 示例,程序输出结果多对多映射表示集合值关联,其中任何数量的实体可以与其他实体的集合关联。 在关系数据库中,一个实体的任何行可以被引用到另一个实体的任意数量的行。 完整的项目目录结构如下所示 - @ManyToMany 示例 在这个例子中,我们将创建学生和图书馆之间的多对多关系,以便可以为任何数量的学生发放任何类型的书籍。 这个例子包含以下步骤 - 第1步: 在包中创建一个实体类,包含学生ID(s_id)和学生姓名(
问题内容: 我正在尝试在Elasticsearch中映射多字段 第一个字段-“中”应包含所有索引列, 第二个字段-“ orig”应按原样包含文本。 例如: 一旦创建并查询,它就是它的外观。 当index =’no’时,是否意味着该字段将永远不会被索引? 问题答案: 对于不同的类型有不同的含义。由于现场在你的问题是它有以下根据意思。 no表示根本无法搜索(作为单个字段;它仍可能包含在_all中)。设
我的实体如下所示: 我的问题是: 为什么会这样,即使在我添加食谱和房子之间的联系之前没有发生? 我怎样才能修好它? 原因是什么?
有两张数据表,其中A表的某个字段的值指向B表的主键。因为B表的任何一条记录理论上可以对应A表的多条记录,所以称这种 映射为B表对A表数据的一对多映射。 上述结构,如果用 POJO 来表示的话,可以参看下图: 如上图,一个 Master 自然就能对应多个 Pet ,所以, Master.pets (一个 List<Pet>) 就可以指向多个 Pet 对象, 那么我们说 Master.pets 就是