简体   繁体   English

休眠-从注释到XML配置文件

[英]Hibernate - from Annotations to XML Configuration files

I used Hibernate Annotations for mapping tables, but I wanted move to xml mapping files (*hbm.xml), and I have some troubles. 我使用了Hibernate Annotations来映射表,但是我想移到xml映射文件(* hbm.xml),但遇到了一些麻烦。 I have 4 tables (users, cars, rentals, user_car) and 3 classes (User, Car, Rental) 我有4个表格(用户,汽车,租赁,user_car)和3个类(用户,汽车,租赁)

User 用户

@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;
  }
 ...
}

Car 汽车

@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;
  }
...
}

Rental 租借

@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 generated mapping files, and I've made some improvements Eclipse生成的映射文件,我做了一些改进

Car 汽车

<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>

User 用户

<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>

Rental 租借

<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>

But, I don't know how can I declare and connect "proxy" table USER_CAR. 但是,我不知道如何声明和连接“代理”表USER_CAR。

Something like this, see 8.5. 像这样,参见8.5。 Bidirectional associations with join tables : 与联接表的双向关联

<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>

Something like this should go in your User definition. 这样的事情应该出现在用户定义中。

  <join table="USER_CAR" optional="true">
    <key column="user_id" unique="true"/>
    <many-to-one name="car" column="car_id" not-null="true"/>
  </join>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM