2015-12-01 26 views
1

因此,我正在關注一個關於hibernate的教程,因爲我想在即將推出的項目中使用該框架。我遇到了@ManyToOne和@OneToMay註釋和雙向映射的問題。我想要做的是非常基本的東西。我只想要兩張桌子,一張表示用戶,另一張表示車輛。現在,我希望用戶能夠擁有多輛車,並且汽車應該「知道」它所屬的用戶。休眠 - @ManyToOne註釋創建額外的列

因爲它似乎是創建一個額外的表格,以保持用戶和車輛之間的連接的「最佳做法」。我試圖用@JoinTable註解(見下面)來做到這一點,但它不工作,因爲我想要它。

要做到這一點,我已經編寫了以下類:

UserDetails.java

​​3210

vehicle.java

@Entity 
public class Vehicle { 
@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private int vehicleId; 
private String vehicleName; 
@ManyToOne 
private UserDetails user; 

... 
getters and setters 

和類檢驗以上:

HibernateTest.Java

public class HibernateTest { 
/** 
* 
* @param args 
*/ 
public static void main(String[] args){ 

    UserDetails user1 = new UserDetails();  
    user1.setUserName("testUser1"); 
    user1.setEmail("testEmail1"); 


    Vehicle vehicle1 = new Vehicle(); 
    vehicle1.setVehicleName("Car"); 

    Vehicle vehicle2 = new Vehicle(); 
    vehicle2.setVehicleName("Jeep"); 

    user1.getVehicle().add(vehicle1); 
    user1.getVehicle().add(vehicle2); 
    vehicle1.setUser(user1); 
    vehicle2.setUser(user1);  

    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
    Session session = sessionFactory.openSession(); 
    session.beginTransaction(); 
    session.save(user1); 
    session.save(vehicle1); 
    session.save(vehicle2); 
    session.getTransaction().commit(); 
    session.close(); 

當我運行它,它的執行沒有任何錯誤或異常並創建下表:

USER_DETAILS 
+------+----------+---------+ 
|userId|email  |userName | 
+------+----------+---------+ 
|1  |testEmail1|testUser1| 
+------+----------+---------+ 

VEHICLE 
+---------+-----------+-----------+ 
|vehicleId|vehicleName|user_userId| <- did not expect this column 
+---------+-----------+-----------+ 
|1  |Car  |1   | 
+---------+-----------+-----------+ 
|2  |Jeep  |1   | 
+---------+-----------+-----------+ 

USER_VEHICLE 
+------+----------+ 
|USER_ID|VEHICLE_ID| 
+-------+----------+ 
|1  |1   | 
+-------+----------+ 
|1  |2   | 
+-------+----------+ 

據我瞭解,其他列「user_userId」這是由休眠創建的似乎是不必要的,因爲用戶和車輛之間的連接已經在「USER_VEHICLE」表中表示出來了,我不打算創建這個額外的列。

我做雙向映射的方式是錯誤的嗎?在沒有創建額外列的情況下,讓這個工作起作用的正確方法是什麼?

+1

即連接表是一對多的關係不必要的。這些只在許多關係中是必需的。由於車輛僅分配給一個用戶,因此用戶表格中的foriegn鍵將進入車輛表格(您看到的額外列)。只有當用戶可以有多輛車輛並且車輛可以有多個用戶時才需要連接表。 –

回答

1

@JoinTable是必要的指定關係的,如果你想有一個@ManyToMany關係。

@Entity 
public class UserDetails { 
    /* ... */ 

    @ManyToMany 
    @JoinTable(name = "user_vehicle", 
     joinColumns = @JoinColumn(name = "user_id"), 
     inverseJoinColumns = @JoinColumn(name = "vehicle_id")) 
    private List<Vehicle> vehicles; 
} 

@Entity 
public class Vehicle { 
    /* ... */ 
} 
USER_DETAILS  VEHICLE   USER_VEHICLE 
+---------+  +------------+ +---------+------------+ 
| user_id |  | vehicle_id | | user_id | vehicle_id | 
+---------+  +------------+ +---------+------------+ 
|  1 |  |   1 | |  1 |   1 | 
+---------+  +------------+ +---------+------------+ 

既然你不想那些,你可以刪除@JoinTable像這樣:

@Entity 
public class UserDetails { 
    /* ... */ 

    @OneToMany(mappedBy = "user") 
    private List<Vehicle> vehicles; 
} 

@Entity 
public class Vehicle { 
    /* ... */ 

    @ManyToOne 
    private UserDetails user; 
} 
USER_DETAILS  VEHICLE  
+---------+  +------------+---------+ 
| user_id |  | vehicle_id | user_id | 
+---------+  +------------+---------+ 
|  1 |  |   1 |  1 | 
+---------+  +------------+---------+ 

你只需要第三個表,如果你想爲(UserDetails,Vehicle)元組存儲額外的數據,在這種情況下你會創建第三類。

@Entity 
public class UserDetails { 
    /* ... */ 

    @OneToMany(mappedBy = "user") 
    private List<UserVehicle> vehicles; 
} 

@Entity 
public class Vehicle { 
    /* ... */ 
} 

@Entity 
public class UserVehicle { 
    /* ... */ 

    @ManyToOne 
    private UserDetails user; 

    @ManyToOne 
    private Vehicle vehicle; 

    @Basic 
    private String someString; 
} 
USER_DETAILS  VEHICLE   USER_VEHICLE 
+---------+  +------------+ +---------+------------+-------------+ 
| user_id |  | vehicle_id | | user_id | vehicle_id | some_string | 
+---------+  +------------+ +---------+------------+-------------+ 
|  1 |  |   1 | |  1 |   1 | Hello  | 
+---------+  +------------+ +---------+------------+-------------+ 
+0

謝謝您的詳細解答,非常感謝!我將我的代碼更改爲您的建議,並且在沒有我以前創建的附加表的情況下工作得很好。 – whimper

0

這是列正常生成。數據庫關係中Many的一側必須保存FK值。

嘗試刪除您@Join註釋...只是@OneToMany

0

嘗試在Vehicle側和User端使用mapedBy財產