用联接表映射:
表示从Shipment到Item关联的属性成为auction:
(可以在另一端使用相同的方法,吧在合格关联映射为双向。然而,可选的一对一关联大多数时候都是单向的。)
插入:
通过注解映射二级联接表:
插入:
表示从Shipment到Item关联的属性成为auction:
<class name="Shipment" table="Shipment">
<id name="shipmentId" column="SHIPMENT_ID" type="integer">
<generator class="native"/>
</id>
<property name="money" type="double" column="MONEY"/>
<!-- 因为必须用一个外键列 映射这个关联,因此在XML中你需要
<many-to-one>映射元素。然而,外键列不在SHIPMENT表中,
而在ITEM_SHIPMENT连接表中。通过<join>映射元素把它移动到那里。 -->
<!-- cascade="save-update":不添加报错object references an unsaved transient instance - save the transient instance before flushing: -->
<join table="ITEM_SHIPMENT" optional="true">
<key column="SHIPMENT_ID"/>
<many-to-one name="auction" column="ITEM_ID" class="Item"
not-null="true" unique="true"
cascade="save-update"></many-to-one>
</join>
</class>
(可以在另一端使用相同的方法,吧在合格关联映射为双向。然而,可选的一对一关联大多数时候都是单向的。)
插入:
Shipment shipment = new Shipment(12D);
Item item = new Item("hello");
shipment.setAuction(item);
session.persist(shipment);
通过注解映射二级联接表:
@Entity
public class Shipment implements Serializable {
@Id
@GeneratedValue
@Column(name="SHIPMENT_ID")
private Integer shipmentId;
private Double money;
@OneToOne(cascade=CascadeType.PERSIST)
//和外键关联的区别就是那个是加入的字段@JoinColumn(name="ADDRESS_ID")
//和hibernate的区别就是joinColumns替代了key,inverseJoinColumns替代了many-to-one
//@JoinTable加入维护表,且本实体为维护端
@JoinTable(name="ITEM_SHIPMENT",
joinColumns=@JoinColumn(name="SHIPMENT_ID"),
inverseJoinColumns=@JoinColumn(name="ITEM_ID"))
private Item auction;
插入:
Shipment shipment = new Shipment(12D);
Item item = new Item("hello");
shipment.setAuction(item);
em.persist(shipment);
通过注解映射二级联接表(可以连接多个字段):
@Entity
//相当于前面的<key column="..."/>和@JoinTable中的joinColumn()。如果没指定名称,那么就会默认使用主键SHIPMENT_ID
@SecondaryTable(name="ITEM_SHIPMENT")
public class Shipment implements Serializable {
@Id
@GeneratedValue
@Column(name="SHIPMENT_ID")
private Integer shipmentId;
private Double money;
@ManyToOne(cascade=CascadeType.PERSIST)
@JoinColumn(table="ITEM_SHIPMENT",name="ITEM_ID")
private Item auction;