有两个表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不支持这种形式的主键生成,还是代码或者配置存在问题?
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不支持这种形式的主键生成,还是代码或者配置存在问题?
解决方案 »
- 一个矩形 有(x1,y1)(x2,y1)(x1,y2)(x2,y2)四个点 现在要求用java写一个程序。取到这四个点的坐标
- Hibernate 做update操作,没报错,但是也没法更新数据
- String返回值的调用
- Struts2 Annotation : 使用注释的方式如何为Action指定拦截器
- 求自定义标签遍历集合
- 如何从JAVA里传数组到ORACLE存储过程?
- 关于hibernate的问题 谢谢
- [求助]关于如何用httpUnit测试frameset类型的jsp页面?
- 有关HashTable的问题,立即结贴!!
- java 使用 itextpdf 生成PDf 多行文本 首行汉字显示不全 如何解决?
- 哪些开源工作流引擎支持Wf-xml?
- 你见过这样的问题吗(??)
不过hibernate是支持复合主键的,培植文件2个字段放一起就ok,