关于EJB多对一中optional
@Entity
@Table(name="Orders")
public class Orders implements Serializable{
private static final long serialVersionUID = -5773058619098330954L;
@Id
@Column(name="o_id")
@GeneratedValue(generator="order_id")
@GenericGenerator(name="order_id",strategy="uuid")
private String id;
@Column(name="o_name",length=50)
private String name;
@Column(name="o_description",length=1000)
private String description;
@OneToMany(mappedBy="lw",fetch=FetchType.EAGER,cascade=CascadeType.ALL)
private Set<OrderItem> ois=new HashSet<OrderItem>();
//getter和setter方法……
}
@Entity
@Table(name="OrderItem")
public class OrderItem implements Serializable{
//private static final long serialVersionUID = 6293925092933166705L;
@Id
@Column(name="oi_id")
@GeneratedValue(generator="oi_id_gen")
@GenericGenerator(name="oi_id_gen",strategy="uuid")
private String id;
@Column(name="oi_name",length=50)
private String name;
@Column(name="oi_count")
private Long count;
@ManyToOne(fetch = FetchType.EAGER,optional=false)
@JoinColumn(name="OI_ORDER_ID")
private Orders lw;
//getter和setter……
}
optional 属性是定义该关联类对是否必须存在,值为false 时,关联类双方都必须存在。值为ture时,被关联方可以不存在(也就是上面代码中Orders 可以不存在)。
设置为false时,如果订单项所属的订单不存在,那么这个时候你去查询该订单项的时候是查询不到的,返回null。设置为true时,如果订单项所属的订单不存在,那么这个时候你去查询该订单项是可以查到的,但是订单项中的订单字段值为null。
实际上在解释Order 与OrderItem的关系成SQL时,optional属性指定了他们的联接关系optional=false OrderItem和Order的联接关系为inner join, optional=true联接关系为left join。