Hibernate中ManyToOne,OneToMany,OneToOne的使用

有3個表:
News:新聞表
NewsResource:新聞附件表
Resource:資源表

表關(guān)系:
1個新聞(News)對應(yīng)多條新聞附件(NewsResource)
News:ID <---> NewsResource:news_id

1個新聞附件(NewsResource)對應(yīng)1個資源(Resource)。
NewsResource:resource_id <---> Resource:ID

實體類如下:

@Entity  
@Table(name="news")  
public class NewsEntity implements Serializable{  
    private static final long serialVersionUID = 48L;  
  
    @Id   
    @GeneratedValue  
    @Column(name="ID")  
    private Long id;  
  
    @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="news")  
    private Set<NewsResourceEntity> newsResource;  
  
    //其他內(nèi)容省略  
}  

NewsResource:
關(guān)于NewsResource表,有兩種寫法:
方法1:
這種寫法用于不想和news表做級聯(lián)更新,只想做級聯(lián)查詢的情況。news_id和resource_id都定義了2次,上面@Column用于自己表的更新,下面的@JoinColumn用于級聯(lián)查詢的時候的Join列。

@Entity  
@Table(name="newsresource")  
public class NewsResourceEntity implements Serializable{  
    private static final long serialVersionUID = 48L;  
  
    @Id  
    @GeneratedValue  
    @Column(name="ID")  
    private Long id;  
  
    @Column(name = "news_id")  
    private Long newsId;  
  
    @Column(name = "resource_id")  
    private Long resourceId;  
  
    @ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)  
    @JoinColumn(name="news_id", insertable = false,updatable = false)  
    private NewsEntity news;  
  
    @OneToOne(optional = false, cascade = CascadeType.MERGE)  
    @JoinColumn(name = "resource_id", referencedColumnName = "id", unique = true, insertable = false,updatable = false)  
    private ResourceEntity resource;  
  
    //其他內(nèi)容省略  
}  

方法2:
這種寫法就是典型的級聯(lián)查詢+級聯(lián)更新。

@Entity  
@Table(name="newsresource")  
public class NewsResourceEntity implements Serializable{  
    private static final long serialVersionUID = 48L;  
  
    @Id   
    @GeneratedValue  
    @Column(name="ID")  
    private Long id;  
  
    @ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)  
    @JoinColumn(name="news_id")  
    private NewsEntity news;  
  
    @OneToOne(optional = false, cascade = CascadeType.MERGE)  
    @JoinColumn(name = "resource_id", referencedColumnName = "id", unique = true)  
    private ResourceEntity resource;  
  
        //其他內(nèi)容省略  
}  

Resource:

@Entity  
@Table(name="resource")  
public class ResourceEntity implements Serializable {  
    private static final long serialVersionUID = 48L;  
  
    @Id   
    @GeneratedValue  
    @Column(name="ID")  
    private Long id;  
  
    @OneToOne(optional = true, cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy = "resource")  
    private NewsResourceEntity newsResource;  
  
        //其他內(nèi)容省略  
}  
manyToOne 示例
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容