最近的一个项目中,尝试在这个应用的@ManyToOne注解中使用@OneToOne注解。本来以为在存储或者查询的时候会出错,结果并没有。任何错误,所有操作都可以正常进行。所以首先我想看看数据库中生成的外键是否相同。@ApiModelProperty("VehicleBrand")@ManyToOneprivateVehicleBrand品牌;@ApiModelProperty("车辆类型")@OneToOneprivateVehicleType类型;我们会发现目前在数据库中并没有什么区别,那么此时我就想去查看他们的源代码来进行比较。@Target({ElementType.METHOD,ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public@interfaceManyToOne{类targetEntity()默认void.class;CascadeType[]cascade()默认{};FetchTypefetch()默认FetchType.EAGER;booleanoptional()默认true;}@Target({ElementType.METHOD,ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public@interfaceOneToOne{ClasstargetEntity()defaultvoid.class;CascadeType[]级联()默认{};FetchTypefetch()默认FetchType.EAGER;布尔可选()默认为真;StringmappedBy()默认"";booleanorphanRemoval()defaultfalse;}通过对比我们可以发现@OneToOne只比@ManyToOne多了两项,mappedBy和orphanRemoval。其余的完全一样。MappedBy仅在OneToOne、OneToMany、ManyToMany上有mappedBy属性,在ManyToOne上不存在;mappedBy标签必须定义在owned端,它指向owner;为了维护,它在一侧声明。mappedBy的值应该是一个表名。mappedBy在StackOverflowAskerQuestion:mappedByactsonFooentity:@ManyToMany(mappedBy="foos")privateSetbarsBarentity:@ManyToManyprivateSetfoos上有更详细的解释翻译其中一个答案就是:如果关联是双向的,则一侧必须是所有者,另一侧必须是对侧(即在更新关联表中的关系值时将忽略它):因此,带有mappedBy属性的边是对侧.没有mappedby属性的一方是所有者。(Foo中的映射)所有者端是Hibernate查看存在哪个关联的地方。因此,例如,如果您将foo添加到Bar的foo集合中,hibernate将向表中插入一个新行。相反,如果您向Foo的bar集合中添加一个bar,则数据库中的任何内容都不会被修改。试论证以上内容。假设有两个实体,Klass和Teacher,它们的关系是多对多的;@EntitypublicclassTeacher{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;@ManyToMany(mappedBy="teacherList")privateListklassList=newArrayList<>();}@EntitypublicclassTeacher{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;//老师有带mappedBy属性的Klass@ManyToMany(mappedBy="teacherList")privateListklassList=newArrayList<>();这时候从klas插入teacher可以成功,但是从teacher插入klass不能成功。所以我尝试在VehicleType实体中声明车辆。@OneToOne(mappedBy="type")私家车;之后,当我在项目中打开相应的页面时,会出现错误:其中,Morethanonerowwiththegivenidentifierwasfound:翻译过来就是:multiplerowswiththegivenidentifierwerefound:Thelinewiththespecified标识符。也达到了我们的预期。由于之前对mappedBy的理解不清晰,所以没有给关联实体添加mappedBy的习惯。由此可知,mappedBy不仅可以实现如上指定维护者的功能,还可以检测存储错误,因此在实际编写中需要添加相应的mappedBy。至于注解中的其他属性,对应jpa的级联操作。由于重复操作非常繁琐,尤其是在处理多个相互关联的对象的情况下,此时我们可以使用级联操作。级联是关联映射中的一个重要概念,是指关联对象(被动方)在主动方对象执行操作时是否同步执行相同的操作。由于暂时没有遇到相应的问题,所以没有深入的了解。大家可以先对它有个概念,等遇到相应的问题再细细体会。参考文章:jpa级联(Cascade)操作小问题:新建后台实体时,要保证和前端实体的字段名一致,否则返回的信息会和前端不匹配。比如前台设置的色域是color,背景是color,那么前台就接收不到后台返回的色域。