有两个表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不支持这种形式的主键生成,还是代码或者配置存在问题?