复合主键的自动生成功能?
有两个表Orders和OrderItem,两者属于主从关系。
Orders表的主键为orderid;
OrderItem表的主键为orderid和id,orderid同时为外键。
Orders表的主键使用GenerationType.TABLE方式生成。
OrderItem表的Id主键使用GenerationType.TABLE方式生成,orderid通过与Orders设置关系生成。
具体实体Bean代码如下:
@Entity
@Table(name = "Orders")
@TableGenerator(name="IdGenerator", table="Id_Generator", pkColumnName = "pkColumn", valueColumnName = "valueColumn",pkColumnValue="Order_Id")
public class Order implements Serializable {
private static final long serialVersionUID = 4970325922198249712L;
private Integer orderid;
private Float amount;
private List<OrderItem> orderItems = new ArrayList<OrderItem>();
private Date createdate;
@Id
@GeneratedValue(strategy = GenerationType.TABLE,generator = "IdGenerator" )
public Integer getOrderid() {
return orderid;
}
public void setOrderid(Integer orderid) {
this.orderid = orderid;
}
public Float getAmount() {
return amount;
}
public void setAmount(Float amount) {
this.amount = amount;
}
@OneToMany(mappedBy="order",cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@OrderBy(value = "id ASC")
public List<OrderItem> getOrderItems() {
return orderItems;
}
public void setOrderItems(List<OrderItem> orderItems) {
this.orderItems = orderItems;
}
@Temporal(value=TemporalType.TIMESTAMP)
public Date getCreatedate() {
return createdate;
}
public void setCreatedate(Date createdate) {
this.createdate = createdate;
}
public void addOrderItem(OrderItem orderitem) {
if (!this.orderItems.contains(orderitem)) {
this.orderItems.add(orderitem);
orderitem.setOrder(this);
}
}
public void removeOrderItem(OrderItem orderitem) {
if (this.orderItems.contains(orderitem)) {
orderitem.setOrder(null);
this.orderItems.remove(orderitem);
}
}
}
public class OrderItemPK implements Serializable {
private Integer orderid;
private Integer id;
public OrderItemPK(){}
public OrderItemPK(Integer orderid, Integer id) {
super();
this.orderid = orderid;
this.id = id;
}
public Integer getOrderid() {
return orderid;
}
public void setOrderid(Integer orderid) {
this.orderid = orderid;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((orderid == null) ? 0 : orderid.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
OrderItemPK other = (OrderItemPK) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (orderid == null) {
if (other.orderid != null)
return false;
} else if (!orderid.equals(other.orderid))
return false;
return true;
}
}
@Entity
@IdClass(OrderItemPK.class)
@TableGenerator(name="IdGenerator1", table="Id_Generator", pkColumnName = "pkColumn", valueColumnName = "valueColumn",pkColumnValue="Item_Id")
public class OrderItem implements Serializable {
private static final long serialVersionUID = -1166337687856636179L;
private Integer id;
private Integer orderid;
private String productname;
private Float price;
private Order order;
public OrderItem() {}
public OrderItem(String productname, Float price) {
this.productname = productname;
this.price = price;
}
@Id
@GeneratedValue(strategy = GenerationType.TABLE,generator = "IdGenerator1" )
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Id
public Integer getOrderid() {
return orderid;
}
public void setOrderid(Integer orderid) {
this.orderid = orderid;
}
@Column(length=100, nullable=false)
public String getProductname() {
return productname;
}
public void setProductname(String productname) {
this.productname = productname;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
@ManyToOne(cascade=CascadeType.REFRESH, optional=false)
@JoinColumn(name = "orderid",insertable=false,updatable=false)
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
}
会话Bean代码如下:
@Stateless
@Remote (OrderDAO.class)
public class OrderDAOBean implements OrderDAO {
@PersistenceContext protected EntityManager em;
public void insertOrder(Order order){
em.persist(order);
}
public Order getOrderByID(Integer orderid) {
Order order = em.find(Order.class, orderid);
order.getOrderItems().size();
return order;
}
@SuppressWarnings("unchecked")
public List<Order> getAllOrder() {
Query query = em.createQuery("select DISTINCT o from Order o inner join fetch o.orderItems order by o.orderid");
return (List<Order>) query.getResultList();
}
}
测试代码如下:
@Test
public void testInsertOrder() {
Order order = new Order();
order.setCreatedate(new Date());
order.addOrderItem(new OrderItem("笔记本电脑", new Float(13200.5)));
order.addOrderItem(new OrderItem("U盘", new Float(620)));
order.setAmount(new Float(13200.5+620));
dao.insertOrder(order);
}
以上代码运行在Jboss AS环境下时,OrderItem实体Bean的两个主键都无法生成,而在Weblogic环境下,能够正常生成。
请问:是因为jboss默认的持久化工具hibernate不支持这种形式的主键生成,还是代码或者配置存在问题?