記錄Hibernate注解在表關聯時的應用 總共有三張表:采集路線CollectLine ,采集點,目的地 其中采集路線和采集點的關系是一對多 采集線路和目的地的關系是一對一,目的地表 是主表,是關系維護端
@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;// 采集線路名稱 //刪除采集線路表時,級聯刪除屬于這個表的采集點 @JSONField(serialize = false) @OneToMany(cascade = CascadeType.ALL, mappedBy = "collectLine", fetch = FetchType.LAZY) private Set<CollectLinePoint> collectLinePoints = new HashSet<CollectLinePoint>();//關聯采集點 //刪除采集線路表時,級聯刪除屬于這個表的目的地 @JSONField(serialize = false) @OneToOne(cascade = CascadeType.ALL, mappedBy = "collectLine", fetch = FetchType.LAZY) private Destination destination; //關聯目的地 //getter setter方法,構造方法}目的地表
@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; // 所屬線路,目的地表是關系維護端 //getter setter方法,構造方法}采集點表
@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;// 所屬線路,采集點表是關系維護端 //getter setter方法,構造方法}主表和從表的區別: 主表負責維護關系,用@JoinColumn注釋,從表不用這個注釋 從表不負責維護關系,從表的@OneToOne等注釋中有mappedBy屬性,該屬性的值為 在主表中定義的 從表類的字段名 。比如在主表(目的地)中定義的 從表(采集線路表)類的字段名
@JSONField注解 @JSONField是fastjson中的一個注解。在屬性頭上加上這個注解中,在對對象進行json轉換時,該屬性,將不會參與格式化。 如果在從表中,定義主表類的屬性時不加這個注解,會跑出如下錯誤
@JoinColumn是可選的,關聯字段默認值列名為:主體的關聯屬性名+下劃線+被關聯端的主鍵列名. 在這個例子中是collectLine_id, 因為關聯的屬性是collectLine, 表CollectLine的主鍵是id.
@Column是可選的,默認值和類的屬性名一致
@Temporal主要是用來指明java.util.Date 或 java.util.Calendar 類型的屬性具體與數據庫(date,time,timestamp)三個類型中的那一個進行映射 例如@Temporal(TemporalType.TIMESTAMP)
@OneToMany等有5個屬性 1.casCade 該屬性定義類和類之間的級聯關系 可選值為CascadeType.PERSIST(級聯新建)CascadeType.REMOVE(級聯刪除)、CascadeType.REFRESH(級聯刷新)、CascadeType.MERGE(級聯更新) CascadeType.ALL 。 2.fetch屬性,有兩個值 FetchType.EAGER表示關系類(本例是OrderItem類)在主類加載的時候同時加載,FetchType.LAZY表示關系類在被訪問時才加載。 默認值是FetchType.LAZY 3.optional = true 該屬性可以為null 4.mappedBy 在從表中才定義這個屬性 5.targetEntity屬性:Class類型的屬性。定義關系類的類型,默認是該成員屬性對應的類類型,所以通常不需要提供定義。 casCade負責增刪改,fetch負責查
//級聯修改和更新,該屬性不能為null,懶加載@ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = false,fetch = FetchType.LAZY)@JoinColumn(name = "collect_line_id")private CollectLine collectLine;// 所屬線路,采集點表是關系維護端新聞熱點
疑難解答