記錄Hibernate注解在表關(guān)聯(lián)時的應(yīng)用 總共有三張表:采集路線CollectLine ,采集點,目的地 其中采集路線和采集點的關(guān)系是一對多 采集線路和目的地的關(guān)系是一對一,目的地表 是主表,是關(guān)系維護(hù)端
@Entity@Table(name = "t_collect_line")public class CollectLine { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) PRivate Long id; //主鍵 @Column(name = "name", length = 100) private String name;// 采集線路名稱 //刪除采集線路表時,級聯(lián)刪除屬于這個表的采集點 @JSONField(serialize = false) @OneToMany(cascade = CascadeType.ALL, mappedBy = "collectLine", fetch = FetchType.LAZY) private Set<CollectLinePoint> collectLinePoints = new HashSet<CollectLinePoint>();//關(guān)聯(lián)采集點 //刪除采集線路表時,級聯(lián)刪除屬于這個表的目的地 @JSONField(serialize = false) @OneToOne(cascade = CascadeType.ALL, mappedBy = "collectLine", fetch = FetchType.LAZY) private Destination destination; //關(guān)聯(lián)目的地 //getter setter方法,構(gòu)造方法}目的地表
@Entity@Table(name = "t_destination_point")public class Destination extends BaseEntity<Long> { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; //主鍵 @Column(name = "name", length = 50) private String name;// 名稱 @OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE }, fetch = FetchType.LAZY) @JoinColumn(name = "collect_line_id") private CollectLine collectLine; // 所屬線路,目的地表是關(guān)系維護(hù)端 //getter setter方法,構(gòu)造方法}采集點表
@Entity@Table(name = "t_collect_line_point")public class CollectLinePoint extends BaseEntity<Long> { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; //主鍵 @Column(name = "name", length = 50) private String name;// 名稱 @ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, fetch = FetchType.EAGER) @JoinColumn(name = "collect_line_id") private CollectLine collectLine;// 所屬線路,采集點表是關(guān)系維護(hù)端 //getter setter方法,構(gòu)造方法}主表和從表的區(qū)別: 主表負(fù)責(zé)維護(hù)關(guān)系,用@JoinColumn注釋,從表不用這個注釋 從表不負(fù)責(zé)維護(hù)關(guān)系,從表的@OneToOne等注釋中有mappedBy屬性,該屬性的值為 在主表中定義的 從表類的字段名 。比如在主表(目的地)中定義的 從表(采集線路表)類的字段名
@JSONField注解 @JSONField是fastjson中的一個注解。在屬性頭上加上這個注解中,在對對象進(jìn)行json轉(zhuǎn)換時,該屬性,將不會參與格式化。 如果在從表中,定義主表類的屬性時不加這個注解,會跑出如下錯誤
@JoinColumn是可選的,關(guān)聯(lián)字段默認(rèn)值列名為:主體的關(guān)聯(lián)屬性名+下劃線+被關(guān)聯(lián)端的主鍵列名. 在這個例子中是collectLine_id, 因為關(guān)聯(lián)的屬性是collectLine, 表CollectLine的主鍵是id.
@Column是可選的,默認(rèn)值和類的屬性名一致
@Temporal主要是用來指明java.util.Date 或 java.util.Calendar 類型的屬性具體與數(shù)據(jù)庫(date,time,timestamp)三個類型中的那一個進(jìn)行映射 例如@Temporal(TemporalType.TIMESTAMP)
@OneToMany等有5個屬性 1.casCade 該屬性定義類和類之間的級聯(lián)關(guān)系 可選值為CascadeType.PERSIST(級聯(lián)新建)CascadeType.REMOVE(級聯(lián)刪除)、CascadeType.REFRESH(級聯(lián)刷新)、CascadeType.MERGE(級聯(lián)更新) CascadeType.ALL 。 2.fetch屬性,有兩個值 FetchType.EAGER表示關(guān)系類(本例是OrderItem類)在主類加載的時候同時加載,F(xiàn)etchType.LAZY表示關(guān)系類在被訪問時才加載。 默認(rèn)值是FetchType.LAZY 3.optional = true 該屬性可以為null 4.mappedBy 在從表中才定義這個屬性 5.targetEntity屬性:Class類型的屬性。定義關(guān)系類的類型,默認(rèn)是該成員屬性對應(yīng)的類類型,所以通常不需要提供定義。 casCade負(fù)責(zé)增刪改,fetch負(fù)責(zé)查
//級聯(lián)修改和更新,該屬性不能為null,懶加載@ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = false,fetch = FetchType.LAZY)@JoinColumn(name = "collect_line_id")private CollectLine collectLine;// 所屬線路,采集點表是關(guān)系維護(hù)端新聞熱點
疑難解答
圖片精選