2012-12-01 46 views
0

我有這樣定義表:如何設置外鍵可空?

@Entity 
public class Shipment implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @ManyToOne(optional=true) 
    @JoinColumn(name="SENDER_ID",referencedColumnName="CUSTOMER_ID", nullable=true) 
    private Customer sender; 

    @ManyToOne(optional=true) 
    // @Column(nullable=true) 
    @JoinColumn(name="TARRIF_ID",referencedColumnName="TARRIF_ID",nullable=true) 
    private Tarrif tarrif; 




    @ManyToOne(optional=true) 
    // @Column(nullable=true) 
    @JoinColumn(name="RECIPIENT_ID",referencedColumnName="CUSTOMER_ID",nullable=true) 
    private Customer recipient; 


    @ManyToOne(optional=true) 
    // @Column(nullable=true) 
    @JoinColumn(name="COURIER_ID",referencedColumnName="COURIER_ID",nullable=true) 
    private Courier courier; 
.... 
} 

我想刪除客戶/快遞/關稅的對象,這是與貨物。所以基本上,我想能夠將外鍵設置爲NULL。

雖然可空設置爲true,GlassFish的說,它不能做,那外鍵約束受到侵犯。有任何想法嗎 ?

im使用的JavaEE 6,javax.persistence.api 1.0.2,glassfish的3+,和java德比分貝。

+0

如果違反約束,它並非來自JPA和Glassfish,但是從你的數據庫。 Evenif協會是可選的,連接列被標記爲空的,如果你在數據庫中沒有空約束,數據庫將應用它,你會得到一個異常。更改您的數據庫架構。 –

+0

如果你告訴我如何去做,我會非常開心。 –

回答

0

你需要呼籲取消對前設置到對象爲NULL的「Java」/JPA任何引用。這將導致外鍵值被設置爲空。

您可以配置外鍵約束在自己的DDL要做到這一點,但你的對象模型(也可能是緩存)仍然是腐敗的(更好的解決您的代碼)。