使用JPA單項一對多外鍵關聯

JPA單項一對多外鍵關聯

一對多即一個對象中包含又另外一個對象的集合。

User主表代碼

@Table(name="USER")
@Entity
public class User {
    private Integer id;
    private String username;
    private String userpassword;
    private String useraddress;
    private List<Order> listOrder;

    @JoinColumn(name="LIST_ORDER")
    @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.REMOVE)
    public List<Order> getListOrder() {
        return listOrder;
    }
    public void setListOrder(List<Order> listOrder) {
        this.listOrder = listOrder;
    }
    @Id
    @TableGenerator(name="PK_PRIMARY",
    table="order_user_sque",
    pkColumnName="pk_column_name",
    pkColumnValue="pk_column",
    valueColumnName="pk_column_value",
    allocationSize=1)
    @GeneratedValue(strategy=GenerationType.TABLE,generator="PK_PRIMARY")
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name="USERNAME")
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }

    @Column(name="USERPASSWORD")
    public String getUserpassword() {
        return userpassword;
    }

    public void setUserpassword(String userpassword) {
        this.userpassword = userpassword;
    }

    @Column(name="USERADDRESS")
    public String getUseraddress() {
        return useraddress;
    }
    public void setUseraddress(String useraddress) {
        this.useraddress = useraddress;
    }
}

代碼中:@JoinColumn(name="LIST_ORDER") -> 表示將外鍵名設置為LIST_ORDER

@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.REMOVE) -> OneToMany中fetch表示查詢時的加載模式[懶加載還是積極加載],cascade屬性表示要級聯操作的模式,此處為刪除主表後從表一並刪除。

Order從表代碼

@Entity
@Table(name="ORDER_USER")
public class Order {
    private Integer id;
    private String orderName;
    //private User user;

    @Id
    @GeneratedValue
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getOrderName() {
        return orderName;
    }
    public void setOrderName(String orderName) {
        this.orderName = orderName;
    }
}

JPA外鍵關聯保存踩坑

比如:用戶表關聯瞭用戶地址的主鍵 

在用戶還沒有設置地址的時候 能單獨添加用戶和更新用戶的個人信息 但是當用戶添加地址的時候去更新數據的時候 jpa卻是插入數據 而不是更新數據、這個時候用戶表中的唯一字段則會報錯、信息已存在!

這樣關聯的

一度迷茫

後來通過sql打印日記 查看到 

jpa 在進行關聯操作的時候 會通過外鍵查詢一次、由於還沒綁定外鍵 查詢為空 這時候jpa就會以為是新增操作,則進行insert 操作

解決

去掉  optional = false

源碼提示

翻譯

/**
      *(可選)關聯是否可選。 如果設置
      *為false,則必須始終存在非空關系。
     */

細節決定成敗

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: