Итак, я следую учебнику о спящем режиме, поскольку я хочу использовать фреймворк в предстоящем проекте. У меня возникла проблема с аннотациями @ManyToOne и @OneToMay и двунаправленным отображением. То, что я хочу сделать, - это очень простой материал. Я просто хочу две таблицы, один из которых представляет пользователя, а другой - автомобиль. Теперь я хочу, чтобы пользователь мог иметь много автомобилей, и автомобиль должен «знать» пользователя, которому он принадлежит.Hibernate - примечание @ManyToOne создает дополнительную колонку
Как представляется, «наилучшей практикой» является создание дополнительной таблицы, которая поддерживает соединение между пользователями и транспортными средствами. Я попытался сделать это с помощью аннотации @JoinTable (см. Ниже), но он не работает так, как я этого хочу.
Чтобы сделать это, я закодированы следующие классы:
UserDetails.java
@Entity
@Table(name="USER_DETAILS")
public class UserDetails {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int userId;
private String userName;
private String email;
@OneToMany()
@JoinTable(name="USER_VEHICLE", [email protected](name="USER_ID"),
[email protected](name="VEHICLE_ID")
)
private Collection<Vehicle> vehicle = new ArrayList<Vehicle>();
...
getters and setters
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», и я не собирался создавать этот дополнительный столбец.
Является ли способ, которым я неправильно использовал двунаправленное отображение? И каков правильный способ заставить это работать без создания дополнительного столбца?
Это присоединиться к таблице ненужно в одном для многих отношениях. Это необходимо только во многих отношениях. Поскольку автомобиль назначается только одному пользователю, ключ foriegn из таблицы пользователя входит в таблицу транспортных средств (дополнительная колонка, которую вы видите). Стол соединения необходим только в том случае, если пользователь может иметь несколько транспортных средств и транспортные средства, которые могут иметь несколько пользователей. –