复合主键的自动生成功能?

incool 2009-03-03 06:32:55
有两个表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不支持这种形式的主键生成,还是代码或者配置存在问题?
...全文
65 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
heavenfeng 2009-03-09
  • 打赏
  • 举报
回复
jboss不知,
不过hibernate是支持复合主键的,培植文件2个字段放一起就ok,

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧