如何使用额外列创建多对多关联?

时间:2015-07-08 12:51:34

标签: java hibernate jpa spring-data-jpa composite-key

我正在使用Hibernate和Spring Data。

我有三个表,第一个是复合主键。

table (grupo)
----------------
|PK idGrupo    |
|PK nombre     |
|              |
|______________|

我还创建了2个表usuario和grupo_matricula(Grupo和usuario之间关系的结果很多)。

table (grupo_matricula)
------------------
|PK idgrupos      |
|   matricula_id  |
|   grupos_id     |
|   nombre        |
|   aceptado      |
|   propietario   |
|                 |
|_________________|

table (usuario)
----------------
|PK matricula  |
|   nombre     |
|   password   |
|______________|

我为实体(grupo)创建了3个Clases,其他为实体(grupo_matricula)的grupo的PK EmbeddedId。

@Entity
@Table(name = "GRUPO")

public class Grupo implements Serializable {
    @EmbeddedId
    protected GrupoPK grupoPK;
    @OneToMany( mappedBy = "grupo_id", cascade=CascadeType.ALL)
    private Set<GrupoMatricula> grupoMatriculas=new HashSet<>(0);
}


@Embeddable
public class GrupoPK implements Serializable {
    @Column(name = "idGrupo")
    private String idGrupo;
    @Column(name = "nombre")
    private String nombre;
}


@Entity
@Table(name = "grupo_matricula")
public class GrupoMatricula implements Serializable {

    @Id
    @GeneratedValue
    @Column(name = "idgrupos")
    private Long idgrupos;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumns({
        @JoinColumn(name = "idGrupo", insertable = false, updatable = false,referencedColumnName = "idGrupo"),
        @JoinColumn(name = "nombre", insertable = false, updatable = false,referencedColumnName = "nombre")
    })
    private Grupo grupo;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "usuario", referencedColumnName = "matricula")
    private User usuario;


    @Column(name = "aceptado")
    private short aceptado;

    @Column(name = "propietario")
    private short propietario;
}


@Entity
@Table(name = "usuario") 
public class User extends  implements Serializable {

    @Id
    @NotNull
    @Pattern(regexp = "^[a-z0-9]*$")
    @Size(min = 1, max = 13)
    @Column(name = "matricula",length = 13, unique = true ,nullable = false)
    private String matricula;

    @JsonIgnore
    @NotNull
    @Size(min = 5, max = 100)
    @Column(length = 100)
    private String password;

    @Size(max = 50)
    @Column(name = "nombre", length = 50)
    private String nombre;

    @JsonIgnore
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "usuario")
    private Set<GrupoMatricula> grupoMatriculaSet=new HashSet<>(0);
}

当我尝试运行该项目时,它向我显示错误:

Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.mx.agora.domain.GrupoMatricula.grupo_id in com.mx.agora.domain.Grupo.grupoMatriculas

2 个答案:

答案 0 :(得分:0)

mappedBy属性表示拥有关系的属性名称,而不是列名称。所以,正确的映射是:

@OneToMany(mappedBy = "grupo", cascade=CascadeType.ALL)

答案 1 :(得分:0)

在您的实体mappedBy中,您的Grupo对象名为@Column。 这是mappedBy需要的名称。

在此,您向@JoinColumn提供数据库中ID的名称。我理解您的错误,因为数据库中的属性名称用于Grupo@OneToMany(mappedBy = "grupo", cascade = CascadeType.ALL) private Set<GrupoMatricula> grupoMatriculas = new HashSet<>(0); 注释。

所以在你的@OneToMany( mappedBy = "grupo_id", cascade=CascadeType.ALL) private Set<GrupoMatricula> grupoMatriculas=new HashSet<>(0); 课程中,你必须把:

@OneToMany

而不是

{{1}}

如果需要,以下是good example使用Hibernate的{{1}}:)