【问题标题】:JPA ManyToMany does not insert into join table when createJPA ManyToMany 在创建时不插入连接表
【发布时间】:2016-06-26 07:27:34
【问题描述】:

我正在使用 JPA 2.1,mysql。

实体Usuario

@Entity
@Table(name = "USUARIO")
public class Usuario {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID_USUARIO")
    private Integer id;

    @Column(name = "NOMBRE", length = 30)
    private String nombre;

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "integrantes", cascade = {CascadeType.ALL})
    private List<NucleoFamiliar> nucleosFamiliares;

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "integrantes", cascade = {CascadeType.ALL})
    private List<GrupoJaas> gruposJaas;

    ... getters setters
}

实体 GrupoJaas

@Entity
@Table(name = "GRUPO_JAAS")
public class GrupoJaas {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID_GRUPO_JAAS")
    private Integer id;

    @Column(name = "NOMBRE", length = 30)
    private String nombre;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "INTEGRANTE_GRUPO_JAAS", joinColumns = {
        @JoinColumn(name = "ID_GRUPO_JAAS") }, inverseJoinColumns = @JoinColumn(name = "ID_USUARIO"))
    private List<Usuario> integrantes;

    ... getters setters
}

Entity NucleoFamiliar

@Entity
@Table(name = "NUCLEO_FAMILIAR")
public class NucleoFamiliar {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID_NUCLEO_FAMILIAR")
    private Integer id;

    @Column(name = "NOMBRE", length = 100)
    private String nombre;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "INTEGRANTE_NUCLEO_FAMILIAR", joinColumns = {
        @JoinColumn(name = "ID_NUCLEO_FAMILIAR") }, inverseJoinColumns = @JoinColumn(name = "ID_USUARIO"))
    private List<Usuario> integrantes;

    ... getters setters
}

当我创建一个具有非空“integrantes”列表的新“NucleoFamiliar”时,jpa 会按预期执行 2 个句子:

insert into NUCLEO_FAMILIAR
insert into INTEGRANTE_NUCLEO_FAMILIAR

当我用非空的“gruposJaas”列表创建一个新的“Usuario”时,jpa 只执行一句话:

insert into USUARIO

为什么不执行插入到 INTEGRANTE_GRUPO_JAAS!!???

两个代码(创建“NucleoFamiliar”和创建“Usuario”)几乎相同,我的意思是,它们几乎相同。

请帮忙,我花了几天时间观察一切,但我还没有找到解决方案(我使用的是 jpa 2.1)

【问题讨论】:

  • 看来你的映射是正确的。创建和保存实体的代码在哪里?如果您发布代码,它可能有助于了解它为什么不起作用。

标签: java mysql hibernate jpa


【解决方案1】:

在 Usario 类中,通过使用 @ManyToMany 关联映射中的 mappedBy 属性,您已指定两个关联的所有者。

在下面的两个关联映射中

@ManyToMany(fetch = FetchType.LAZY, mappedBy = "integrantes", cascade =  {CascadeType.ALL})
private List<NucleoFamiliar> nucleosFamiliares;

@ManyToMany(fetch = FetchType.LAZY, mappedBy = "integrantes", cascade = {CascadeType.ALL})
private List<GrupoJaas> gruposJaas;` 

通过在关系中使用 mappedBy 属性,您有效地指定这些关联的所有者是 GrupoJass 和 NucleoFamiliar。

现在,在关系中,所有者只能更新关系状态。因此,当您保存 NucleoFamiliar 时,它也会更新 JoinTable 的关系。

【讨论】:

  • 你真是太棒了!多谢!!!这就是答案。我必须“更新” gruposJaas.integrantes 才能在连接表中插入注册表!再次感谢!
  • @Gabriel 欢迎您..也请接受答案 :)
猜你喜欢
  • 2016-08-17
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
相关资源
最近更新 更多