2017-08-14 153 views
0

我想使用Spring數據來執行連接的查詢,但我的表之一有一個複合鍵,我不知道如何映射實體。休眠複合鍵加入

這裏是數據模型的一個比喻:

table: device 
pk=model_id 
pk=serial_id 
... 

table: device_settings 
pk=device_settings_id 
fk=model_id 
fk=serial_id 
... 

下面是代碼,這不編譯的一個類比由於「的mappedBy」屬性,該屬性是不存在。

@Entity 
@Table(name = "device_settings") 
public class DeviceSettings { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "device_settings_id") 
    private Long id; 

    // Pretty sure this is the problem 
    @OneToMany(targetEntity = Device.class, mappedBy = "deviceKey", cascade = {CascadeType.MERGE}, fetch = FetchType.EAGER) 
    @JoinColumns({ 
     @JoinColumn(name = "model_id", referencedColumnName = "model_id"), 
     @JoinColumn(name = "serial_id", referencedColumnName = "serial_id")}) 
    private List<Device> devices; 
} 

@Entity 
@Table(name = "device") 
public class Device { 
    @Id 
     private DeviceKey deviceKey; 
    } 
    ... 
} 


@Embeddable 
public class DeviceKey implements Serializable { 
    private static final long serialVersionUID = -1943684511893963184L; 

    @Column(name = "model_id") 
    private Long modelId; 

    @Column(name = "serial_id") 
    private Short serialId; 
} 

回答

1

協會標記爲的mappedBy不能定義數據庫的映射,比如@JoinTable或@JoinColumn

實現自己的情況下,您必須定義@ManyToOne:

@ManyToOne(cascade = {CascadeType.MERGE}, fetch = FetchType.EAGER) 
    @JoinColumns({ 
     @JoinColumn(name = "model_id", referencedColumnName = "model_id"), 
     @JoinColumn(name = "serial_id", referencedColumnName = "serial_id")}) 
    private Device device; 

這將end up model_id,serial_id,device_settings_id

在設備實體定義@JoinColumn 實體:

DeviceSettings

@Entity 
    @Table(name = "device_settings") 
    public class DeviceSettings { 

     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     @Column(name = "device_settings_id") 
     private Long id; 


     @OneToMany(mappedBy = "deviceSettings", cascade = {CascadeType.MERGE}, fetch = FetchType.EAGER) 
     private List<Device> devices; 
} 

設備實體

@Entity 
@Table(name = "device") 
public class Device { 

     @EmbeddedId 
     private DeviceKey deviceKey; 

     @ManyToOne 
     @JoinColumn(name="device_settings_id") 
     private DeviceSettings deviceSettings; 
     //getters and setters 
} 

注意:您可以決定哪些是主人的關係,並把你的映射accorindly無論是一個設備有很多設備設置或其他方式。

+0

謝謝,這樣做的編譯,但它讓我想知道如何可以從關係的非所有者利用Spring Data ...是一個簡單的事實,我可以調用一個實體組合的.findOne()方法一個渴望獲取策略總是會讓我有能力在任何一方執行CRUD操作?謝謝你的回答。 – JonasJSchreiber

+1

@JonasJSchreiber是的,但是你仍然可以用LAZY抓取,只要它在服務級別得到關注。如果您有任何困難,請告訴我們。 – Barath

+0

我想我可能會遇到這個映射的遞歸性問題。如果實體需要持久化,並且每個實體都需要引用另一個實體,那麼您是不是可以潛入調試器中的對象,並且看到它們可以無限地相互引用? – JonasJSchreiber