Hibernate - от аннотаций до файлов конфигурации XML - PullRequest
0 голосов
/ 15 февраля 2011

Я использовал аннотации Hibernate для таблиц сопоставления, но я хотел перейти на файлы сопоставления xml (* hbm.xml), и у меня возникли некоторые проблемы.У меня есть 4 таблицы (пользователи, автомобили, аренда, user_car) и 3 класса (пользователь, автомобиль, прокат)

Пользователь

@Entity
@Table(name = "USERS")
@SuppressWarnings("serial")
public class User implements Serializable {

  private Long id;
  private List<Car> cars;

  @Id
  @GeneratedValue
  @Column(name = "ID")
  public Long getId() {
      return id;
  }
  @OneToMany(cascade = CascadeType.ALL)
  @JoinTable(name = "USER_CAR", joinColumns = { @JoinColumn(name = "CAR_ID") },   inverseJoinColumns = { @JoinColumn(name = "USER_ID", referencedColumnName = "ID") })
  public List<Car> getCars() {
      return cars;
  }
 ...
}

Автомобиль

@Entity
@Table(name = "CARS")
@SuppressWarnings("serial")
public class Car implements Serializable {

  private Long id;
  private User owner;

  @Id
  @GeneratedValue
  @Column(name = "ID")
  public Long getId() {
      return id;
  }
  @OneToOne(cascade = CascadeType.ALL)
  @JoinTable(name = "USER_CAR", joinColumns = { @JoinColumn(name = "CAR_ID", referencedColumnName = "ID") }, inverseJoinColumns = { @JoinColumn(name = "USER_ID") })
  public User getOwner() {
      return owner;
  }
...
}

Прокат

@Entity
@Table(name = "RENTALS")
@SuppressWarnings("serial")
public class Rental implements Serializable {

  private Long id;
  private Car car;
  private User user;
  private Date date;

  @Id
  @GeneratedValue
  @Column(name = "ID")
  public Long getId() {
      return id;
  }
  @ManyToOne
  @JoinColumn(name = "CAR_ID")
  public Car getCar() {
      return car;
  }
  @ManyToOne
  @JoinColumn(name = "USER_ID")
  public User getUser() {
      return user;
  }
  @Column(name = "RENT_DATE", nullable=false)
  @Temporal(TemporalType.DATE)
  public Date getDate() {
      return date;
  }
...
}

Созданные Eclipse файлы сопоставления, и я сделал некоторые улучшения

Автомобиль

<hibernate-mapping>
<class name="com.bontade.mvc.models.Car" table="CARS">
    <id name="id" type="java.lang.Long">
        <column name="ID" />
        <generator class="assigned" />
    </id>
    <many-to-one name="owner" class="com.bontade.mvc.models.User" fetch="join">
        <column name="USER_CAR" />
    </many-to-one>
</class>
</hibernate-mapping>

Пользователь

<hibernate-mapping>
<class name="com.bontade.mvc.models.User" table="USERS">
    <id name="id" type="java.lang.Long">
        <column name="ID" />
        <generator class="assigned" />
    </id>
    <property name="name" not-null="true" length="100" type="java.lang.String">
        <column name="NAME" />
    </property>
    <list name="cars" inverse="false" table="CAR" lazy="true">
        <key>
            <column name="ID" />
        </key>
        <list-index></list-index>
        <one-to-many class="com.bontade.mvc.models.Car" />
    </list>
</class>
</hibernate-mapping>

Прокат

<hibernate-mapping>
<class name="com.bontade.mvc.models.Rental" table="RENTALS">
    <id name="id" type="java.lang.Long">
        <column name="ID" />
        <generator class="assigned" />
    </id>
    <many-to-one name="car" class="com.bontade.mvc.models.Car" fetch="join">
        <column name="CAR_ID" />
    </many-to-one>
    <many-to-one name="user" class="com.bontade.mvc.models.User" fetch="join">
        <column name="USER_ID" />
    </many-to-one>
    <property name="date" type="java.util.Date">
        <column name="RENT_DATE" />
    </property>
</class>
</hibernate-mapping>

Но я не знаю, как мне объявить и подключить таблицу прокси USER_CAR.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2011

Примерно так, см. 8.5.Двунаправленные ассоциации с таблицами соединений :

<class name="com.bontade.mvc.models.Car" table="CARS">
    ...
    <join table="USER_CAR" 
        inverse="true" 
        optional="true">
        <key column="CAR_ID"/>
        <many-to-one name="owner"
            column="USER_ID"
            not-null="true"/>
    </join>
</class>

<class name="com.bontade.mvc.models.User" table="USERS">
    ...
    <list name="cars" inverse="false" table="USER_CAR" lazy="true">
        <key>
            <column name="CAR_ID" />
        </key>
        <many-to-many column = "USER_ID" unique = "true" 
            class="com.bontade.mvc.models.Car" />
    </list>
</class>
1 голос
/ 15 февраля 2011

Примерно так должно идти в вашем определении пользователя.

  <join table="USER_CAR" optional="true">
    <key column="user_id" unique="true"/>
    <many-to-one name="car" column="car_id" not-null="true"/>
  </join>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...