当前位置: 首页 > 知识库问答 >
问题:

多对多jpa stackoverflow

郤旭东
2023-03-14

我调试了代码,变量“empresasucursal”嵌入了大量相同的信息,导致内存溢出。根据下图的数据库模型,正确的方法是什么

[![empresa_sucursal][1]][1]

Java Empresa类

@Entity
@Table(name = "empresa")
public class Empresa implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="idempresa")
private Integer idempresa;

@javax.persistence.Temporal(TemporalType.TIMESTAMP)
private Date fechaRegistro;

@Column(name="direccionFiscal")
private String direccion;

private String nombre;

@Column(name="contactoTelefonoCelular")
private String celular;

@Column(name="regimenUnicoContribuyente")
private String ruc;


private String estado;

private String codigoEmpresa;


@OneToMany(mappedBy="empresa")
private List<EmpresaSucursal> empresaSucursal;
}

Java类

@Entity
@Table(name = "sucursal")
public class Sucursal implements Serializable{


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idsucursal")
private int idsucursal;

@Column(name = "nombreSucursal")
private String nombre;

private String direccion;

@Column(name = "contactoTelefonoFijo")
private String telefonoFijo;

private String fechaRegistro;

private String estado;

@Column(name = "codigoSucursal")
private String codigoSucursal;

@OneToMany(mappedBy = "sucursal")
private List<EmpresaSucursal> empresaSucursal;
}

Java EmpresaSucursal类

@Entity
@Table(name = "empresa_sucursal")
public class EmpresaSucursal implements Serializable {

@Id
@ManyToOne
@JoinColumn(name = "idempresa",referencedColumnName="idempresa")
private Empresa empresa;

@Id
@ManyToOne
@JoinColumn(name = "idsucursal" ,referencedColumnName="idsucursal")
private Sucursal sucursal;

@Column(name="estado")
private String estado;

}

控制器方法

@RequestMapping(method = RequestMethod.GET, value = "/{empresaId}", produces 
= MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Empresa obtenerEmpresa(@PathVariable Integer empresaId) throws 
EmpresaNotExistException{
    Empresa empresa =this.empresaRepository.findOne(empresaId);
    System.out.println(empresa.toString());
    return empresa;
}

控制台出错

017-04-17 10:05:10.442警告9788-[nio-8080-exec-1]。w、 s.m.s.DefaultHandlerExceptionResolver:无法写入HTTP消息:org。springframework。http。转换器。HttpMessageNotWritableException:无法写入内容:无限递归(StackOverflower)(通过引用链:com.gdata.auth.bean.Sucursal[“empresaSucursal”]-

2017-04-17 10:05:10.447WARN 9788---[nio-8080-exec-1]. w. s. s. DefaultHandlerExceptionResolver:处理[org.springframework.http.converter.HttpMessageNotWritableException]导致异常

共有3个答案

顾昊穹
2023-03-14
@JsonIgnore
@OneToMany(mappedBy="empresa")
private List<EmpresaSucursal> empresaSucursal;
姬高澹
2023-03-14

您使用的是jpa还是Hibernate?在hibernate中,同一类中允许多个@id。但它不兼容JPA。但实际上您不必在EmpresaSucull al类中的每个引用处使用@id。使用单独的id字段而不是像'

@Id
@GeneratedValue
private int id;

如果你真的需要一个id字段。

您可以使用@UniqueConstraint(columnNames={,”“})来定义复合键。

常彭薄
2023-03-14

这些用于求解无限递归(StackOverflowError Ex)

你可以使用JsonIgnore来打破这个循环。

或:

@JsonManagedReference是引用的前向部分,通常会序列化@JsonBackReference是引用的后面部分,它将从序列化中省略。

请检查考试:

@Entity
@Table(name = "empresa_sucursal")
public class EmpresaSucursal implements Serializable {

/.../

@JsonBackReference
@Id
@ManyToOne
@JoinColumn(name = "idsucursal" ,referencedColumnName="idsucursal")
private Sucursal sucursal;


@Entity
@Table(name = "empresa")
public class Empresa implements Serializable {

/.../

@JsonManagedReference
@OneToMany(mappedBy="empresa")
private List<EmpresaSucursal> empresaSucursal;
}
 类似资料:
  • 问题内容: 我有一个包含 产品* 列表的表 订单 。对于与特定订单相对应的每个 产品 ,我需要存储一个 地址 列表,在该 地址 中应将单个产品(每个订单基于每个产品)发送到 * 所以我有这张表,在 订单 和 产品 上有很多很多,我需要的是将上表中的每个条目映射到 地址 列表。所以我需要像 并将上表中的条目映射到地址列表,我需要上述PK和地址ID(我的地址表的主键)上的多对多表 这里PK_Order

  • 多对多关联模型 满足条件:一个学生可以选择多个课程,一个课程也可以被多个学生选择 示例: student 学生表 class 课程表 student_has_class 中间表 >[danger] 多对多,需要借助第三个中间表,中间表包含了2个外键,分别是两个表的主键 我们假设有这样的一个场景,文章(Post)可以有多个标签(Tag),同样,一个Tag也可以对应多个Post,我们需要一张关联表Po

  • 问题内容: 假设我有一个数据库,其中包含人员,杂货店和您可以在商店中购买的商品,如下所示: 我还有一个表格可以跟踪哪些商店销售什么: 我还有一张桌子上有购物清单 我的问题是,给定一个人或他们的ID,找出他们可以去的商店的最佳方法是什么,以便他们将所有物品都列入清单。MySQL中是否有针对这些类型的计算的模式? 我的尝试(非常丑陋和凌乱)是这样的: 谢谢你的时间! 使用数据编辑SQL 问题答案: 如

  • 问题内容: 好的,所以这可能是一个琐碎的问题,但是我在可视化和理解差异以及何时使用它们方面遇到困难。对于诸如单向和双向映射之类的概念如何影响一对多/多对多关系,我也还不清楚。我现在正在使用Hibernate,因此任何与ORM相关的解释都将有所帮助。 举例来说,我有以下设置: 那么在这种情况下,我将进行哪种映射?对于这个特定示例的答案肯定会受到赞赏,但我也确实希望获得何时使用一对多和多对多以及何时使

  • 问题内容: 我正在寻找以下列方式属于父类的对象的列表: SQLAlchemy examples文件夹具有简单的多对一关系,在我的示例中,类B和C是A的“父”类(而不是相反),但是我一生都无法解决如何将其逆转为一对多,然后添加双向关系以使其变为多对多。 谁能帮我这个忙吗? 问题答案: 这有点痛苦,并且显然需要更多的抛光,但是就像这样:

  • 还是就这之前标签的例子,但是为了不破坏之前的代码,这回新建一个scopeManyToMany.ts文件。代码如下。 scope 里面指定的值, 就是在连接表创建数据的时候,会自动把里面设定好的字段填充好,并且查询的时候会自动把这个条件当做 where 的一项,所以这样我们就能做出区分了。 import Sequelize from 'sequelize'; const sequelize = n

  • 在如今的社会,我们非常喜欢给人打上标签,比如 颜值逆天、暖烘烘、高富帅等等。高富帅并不是某一个人的专利,一个人可以被别人打上多个标签,一个标签也可以打在多个人上面。这就是多对多关系。 声明多对多关系需要用到belongsToMany方法。 User.beblongsToMany(Tag, {through: 'user_tag'}); Tag.belongsToMany(User, {throug

  • 比如我们有一张文章表,一张书籍表,一张标签表,一张标签关联表。文章和书籍共用标签库。 mysql> desc tb_article; +---------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra