jpa 自身多对多 关联 怎么配?

时间:2022-09-11 13:03:07
一篇文章有多篇的相关文章,有个表ARTICLE,还有个关联表ARTICLE_REL,字段如下:
ARTICLE:id, title, content
ARTICEL_REL:id, article1_id, article1_title, article2_id, article2_title

用jpa该怎么标注呢?

6 个解决方案

#1


最近也准备看JPA呢。。。不懂的飘过

#2


@Entity(name="tableName")
public class Artile {
@Id//主键字段
@Column(name="ColumnName")
private String id; 
@Column(name="title")
private String title; 
@Column(name="content")
private String content ;
//。。。。。getter、setter略
         @OneToMany(cascade = CascadeType.ALL, mappedBy = "gsosApplyInfo")
        private List<ArticelRel> articelRel=new ArrayList<ArticelRel>();
}

@Entity(name="tableName")
public class Artile {
        @Entity(name="ARTICEL_REL")
public class ArtileRel {
@Id
@Column(name="id")
private String id;
@Column(name="id")
private String article1_id;
@Column(name="id")
private String article1_title;
@Column(name="id")
private String article2_id;
@Column(name="id")
private String article2_title ;
        @JoinColumn(name = "id", referencedColumnName = "id", insertable = false, updatable = false)//其中id关联的article表的id字段
        @ManyToOne(cascade=CascadeType.REFRESH,optional = false)
        private Artile artile ;
}

#3



@Entity(name="tableName")//tableName是对应的表名
public class Article {
@Id//主键字段
@Column(name="ColumnName")//Column是对应的字段名
private String id;
@Column(name="title")
private String title;
@Column(name="content")
private String content ;
//。。。。。getter、setter略
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "article")//一对多关联,也就是ArtileRel中的article属性
        private List <ArticelRel> articelRel=new ArrayList <ArticelRel>();
}

@Entity(name="ARTICEL_REL")
public class ArtileRel {
@Id
@Column(name="id")
private String id;
@Column(name="id")
private String article1_id;
@Column(name="id")
private String article1_title;
@Column(name="id")
private String article2_id;
@Column(name="id")
private String article2_title ;
        @JoinColumn(name = "id", referencedColumnName = "id", insertable = false, updatable = false)//其中id关联的article的id属性
        @ManyToOne(cascade=CascadeType.REFRESH,optional = false)
        private Article article ;
}

#4


to lgq_0714:首先感谢你的回答,按照你的思路,是把它们写成1对多的关系,但我不明白你对ArtileRel的标注。
我这么认为:
1)首先应该把article1_id作为外键字段,对应Article的id,(其实我主要想知道,怎么让article1_title对应Article中的title,在另外一个帖子发现不行),然后对@JoinColumn(name = "id", referencedColumnName = "id", ..)能解释一下吗,name和referencedColumnName有什么区别?

2)我觉得应该把他们作为自身多对多的关系来标注,假设把ARTICLE_REL改成:id, article1_id, article2_id,作为中间表,这样改怎么配???

#5


引用 3 楼 lgq_0714 的回复:
Java code
@Entity(name="tableName")//tableName是对应的表名publicclass Article {
    @Id//主键字段    @Column(name="ColumnName")//Column是对应的字段名private String id;
    @Column(name="title")private String title;
  ?-


up

#6


引用 4 楼 matrix1984 的回复:
to lgq_0714:首先感谢你的回答,按照你的思路,是把它们写成1对多的关系,但我不明白你对ArtileRel的标注。
我这么认为:
1)首先应该把article1_id作为外键字段,对应Article的id,(其实我主要想知道,怎么让article1_title对应Article中的title,在另外一个帖子发现不行),然后对@JoinColumn(name = "id", referencedColumnName = "id", ..)能解释一下吗,name和referencedColumnName有什么区别?

2)我觉得应该把他们作为自身多对多的关系来标注,假设把ARTICLE_REL改成:id, article1_id, article2_id,作为中间表,这样改怎么配???

1、让article1_title对应Article中的title:@JoinColumn(name = "article1_title", referencedColumnName = "title", ..)
name=“article1_title”是将数据库表ARTICEL_REL列article1_title用作连接列,referencedColumnName = "title"就是关联表的对应列,也就是对应ARTICLE表的title列
2、不好意思,这个没没配过

#1


最近也准备看JPA呢。。。不懂的飘过

#2


@Entity(name="tableName")
public class Artile {
@Id//主键字段
@Column(name="ColumnName")
private String id; 
@Column(name="title")
private String title; 
@Column(name="content")
private String content ;
//。。。。。getter、setter略
         @OneToMany(cascade = CascadeType.ALL, mappedBy = "gsosApplyInfo")
        private List<ArticelRel> articelRel=new ArrayList<ArticelRel>();
}

@Entity(name="tableName")
public class Artile {
        @Entity(name="ARTICEL_REL")
public class ArtileRel {
@Id
@Column(name="id")
private String id;
@Column(name="id")
private String article1_id;
@Column(name="id")
private String article1_title;
@Column(name="id")
private String article2_id;
@Column(name="id")
private String article2_title ;
        @JoinColumn(name = "id", referencedColumnName = "id", insertable = false, updatable = false)//其中id关联的article表的id字段
        @ManyToOne(cascade=CascadeType.REFRESH,optional = false)
        private Artile artile ;
}

#3



@Entity(name="tableName")//tableName是对应的表名
public class Article {
@Id//主键字段
@Column(name="ColumnName")//Column是对应的字段名
private String id;
@Column(name="title")
private String title;
@Column(name="content")
private String content ;
//。。。。。getter、setter略
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "article")//一对多关联,也就是ArtileRel中的article属性
        private List <ArticelRel> articelRel=new ArrayList <ArticelRel>();
}

@Entity(name="ARTICEL_REL")
public class ArtileRel {
@Id
@Column(name="id")
private String id;
@Column(name="id")
private String article1_id;
@Column(name="id")
private String article1_title;
@Column(name="id")
private String article2_id;
@Column(name="id")
private String article2_title ;
        @JoinColumn(name = "id", referencedColumnName = "id", insertable = false, updatable = false)//其中id关联的article的id属性
        @ManyToOne(cascade=CascadeType.REFRESH,optional = false)
        private Article article ;
}

#4


to lgq_0714:首先感谢你的回答,按照你的思路,是把它们写成1对多的关系,但我不明白你对ArtileRel的标注。
我这么认为:
1)首先应该把article1_id作为外键字段,对应Article的id,(其实我主要想知道,怎么让article1_title对应Article中的title,在另外一个帖子发现不行),然后对@JoinColumn(name = "id", referencedColumnName = "id", ..)能解释一下吗,name和referencedColumnName有什么区别?

2)我觉得应该把他们作为自身多对多的关系来标注,假设把ARTICLE_REL改成:id, article1_id, article2_id,作为中间表,这样改怎么配???

#5


引用 3 楼 lgq_0714 的回复:
Java code
@Entity(name="tableName")//tableName是对应的表名publicclass Article {
    @Id//主键字段    @Column(name="ColumnName")//Column是对应的字段名private String id;
    @Column(name="title")private String title;
  ?-


up

#6


引用 4 楼 matrix1984 的回复:
to lgq_0714:首先感谢你的回答,按照你的思路,是把它们写成1对多的关系,但我不明白你对ArtileRel的标注。
我这么认为:
1)首先应该把article1_id作为外键字段,对应Article的id,(其实我主要想知道,怎么让article1_title对应Article中的title,在另外一个帖子发现不行),然后对@JoinColumn(name = "id", referencedColumnName = "id", ..)能解释一下吗,name和referencedColumnName有什么区别?

2)我觉得应该把他们作为自身多对多的关系来标注,假设把ARTICLE_REL改成:id, article1_id, article2_id,作为中间表,这样改怎么配???

1、让article1_title对应Article中的title:@JoinColumn(name = "article1_title", referencedColumnName = "title", ..)
name=“article1_title”是将数据库表ARTICEL_REL列article1_title用作连接列,referencedColumnName = "title"就是关联表的对应列,也就是对应ARTICLE表的title列
2、不好意思,这个没没配过