1

テーブルのマッピングに Hibernate Annotations を使用していましたが、xml マッピング ファイル (*hbm.xml) に移動したかったのですが、いくつか問題があります。4 つのテーブル (users、cars、rentals、user_car) と 3 つのクラス (User、Car、Rental) があります。

ユーザー

@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 を宣言して接続する方法がわかりません。

4

2 に答える 2

2

このようなものについては、 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>
于 2011-02-15T17:29:12.193 に答える
1

このようなものをユーザー定義に入れる必要があります。

  <join table="USER_CAR" optional="true">
    <key column="user_id" unique="true"/>
    <many-to-one name="car" column="car_id" not-null="true"/>
  </join>
于 2011-02-15T17:27:51.697 に答える