2016-12-25 164 views
0

我正在與JPA拼搏。我嘗試了幾件事,但我無法弄清楚標註的正確方法。 想要什麼就像訂單/訂單行關係。休眠 - 映射屬性OneToMany。 (如OrderLine)不關聯

因此:

  • 訂單(PK =訂單ID,字段= [...])
  • 訂單行(PK1 =訂單ID,PK2 = orderLineId,字段= [...])

顯然,OrderLine.orderId是指'訂單'表。

我在功能上想要做的是至少:

  • 檢索與和沒有所有orderlines訂單。它應該有一個集合
  • 通過完整的PK檢索訂單,但沒有關聯的訂單。
  • 通過orderId檢索訂單列表。

我只想要這兩個表和類。沒有什麼比這更少。 我嘗試了幾件事情。任何人都可以通過在這兩個類中加入正確的註釋和成員來幫助我?

編輯:我到目前爲止所做的。 請注意,在此實際示例中,User = Order和UserRun = OrderLine。所以,我對一個單獨的'Run'實體不感興趣。僅僅是由Orderline描述的UserRun。

@Entity 
@Table(name = "user_runs") 
public class UserRun { 

    @EmbeddedId 
    private UserRunKey id; 

    public UserRun(){}; 

    public UserRun(String userName, String runUuid) { 
     this.id = new UserRunKey(userName, runUuid); 
    } 

    public String getUserName() { 
     return this.id.getUserName(); 
    } 
    public String getRunUuid() { 
     return this.id.getRunUuid(); 
    } 
} 

@Embeddable 
class UserRunKey implements Serializable { 

    @Column(name = "username") 
    private String userName; 

    @Column(name = "run_uuid") 
    private String runUuid; 

    public UserRunKey(){}; 

    public UserRunKey(String userName, String runUuid) { 
     this.runUuid = runUuid; 
     this.userName = userName; 
    } 

    public String getUserName() { 
     return userName; 
    } 

    public String getRunUuid() { 
     return runUuid; 
    } 

} 

這創造了一個userruns /訂單項目表中的錯誤的方法的PK: 創建表user_runs(run_uuid VARCHAR(255)不爲空,用戶名VARCHAR(255)不爲空,主鍵(run_uuid,用戶名) )

  1. 我想讓主鍵反向。
  2. 我想要用戶名爲FK給用戶
  3. 我想在我的User-class中設置一個。

當我做我的用戶級以下:

@OneToMany 
private Set<UserRun> userRuns; 

這將創建一個 創建表user_user_runs(user_username VARCHAR(255)NOT NULL,user_runs_run_uuid VARCHAR(255)NOT NULL,user_runs_username varchar(255)不爲null,主鍵(user_username,user_runs_run_uuid,user_runs_username)) 這就是我絕對不想要的東西!再次,我不想要一個運行對象(與Order Line一樣,沒有人對Line類感興趣)

+1

你應該張貼到現在爲止您做了什麼,並解釋你的問題。 – davidxxx

+0

編輯原文。儘管如此,我認爲這使問題更加不清楚。它基本上應該是這樣的:我想要2個類:Order,OrderLine。我也想要2個表:Order(pk = orderId),OrderLine(pk =(orderId,orderLineId))。如何用JPA註釋完成這樣一個簡單的例子? –

+0

如果runUuid(該名稱似乎是唯一的,並且因此足以唯一標識一個UserRun)就是實體的主鍵,那麼一切都會容易得多。然後,您將擁有一個由連接列映射的簡單直觀的標準OneToMany關聯。 –

回答

0

我想我已經弄明白了。

的UserRun /訂單項目類:

@Entity 
@Table(name = "user_runs") 
public class UserRun { 

    @EmbeddedId 
    private UserRunKey id; 

    public UserRun(){}; 

    public UserRun(String userName, String runUuid) { 
     this.id = new UserRunKey(userName, runUuid); 
    } 

    public String getUserName() { 
     return this.id.getUserName(); 
    } 
    public String getRunUuid() { 
     return this.id.getRunUuid(); 
    } 
} 

@Embeddable 
class UserRunKey implements Serializable { 

    @Column(name = "username") 
    private String userName; 

    @Column(name = "run_uuid") 
    private String zrunUuid; //starts with a z, so the PK will be pk(username,run_uuid). Apparently, order in PK is determined from the variable names (alphabetic order).... 

    public UserRunKey(){}; 

    public UserRunKey(String userName, String zrunUuid) { 
     this.zrunUuid = zrunUuid; 
     this.userName = userName; 
    } 

    public String getUserName() { 
     return userName; 
    } 

    public String getRunUuid() { 
     return zrunUuid; 
    } 

} 

在UserClass的:

@OneToMany(mappedBy = "id.userName", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
private Set<UserRun> userRuns; 

不幸的是,有2個缺點:

  1. 我看到有執行2個查詢而不是用戶名上的加入。一個檢索用戶,1檢索設置...

  2. 我需要改變PK(化合物/嵌入式)的變量名稱。似乎沒有乾淨的方式來定義PK訂單。 (真的嗎?)。幸運的是,變量名是私有的,並且不被getter公開。

如果有人知道這兩個問題更乾淨的方法。讓我知道!

0

我認爲你必須做的是以下幾點:

  • 因爲主鍵是你需要一個ID類,如你已經做了複合鍵:

    @Embeddable 
    class OrderLinePK implements Serializable { 
        // you can use physical mapping annotations such as @Column here 
        @Column(name="...") 
        private Integer orderLineID; 
    
        // This is foreign key and the physical mapping should be done 
        // on the entity, and not here 
        private Integer orderID; 
    
        public OrderLinePK(){} 
    
        // getters + setters 
        // orverride equals() and hashCode() methods 
    } 
    
  • 實現OrderLine實體

    @Entity 
    public class OrderLine { 
        @EmbededId private OrderLinePK id; 
    
        @Mapsid("orderID") 
        @ManyToOne 
        @JoinColumn(name = "ORDER_ID", referencedColumn="ID") 
        private Order order; 
    
        // getters + setters .... 
    
    } 
    
  • Order實體:

    @Entity 
    public class Order { 
        @Id 
        private Integer id; 
    
        @OneToMany(fetch = FetchType.LAZY) // actually default by 1-to-n 
        private Coolection<OrderLine> orderLines; 
    
        // getters + setters .... 
    
    }