Java 如何级联插入
更新2014-01-29:我更改了关系,因此实体代码和错误也更改了 我必须在数据库中存储一些数据,我的关系如下: 订单3D 1------*画1------*线 我想这样保存一切:Java 如何级联插入,java,hibernate,foreign-key-relationship,Java,Hibernate,Foreign Key Relationship,更新2014-01-29:我更改了关系,因此实体代码和错误也更改了 我必须在数据库中存储一些数据,我的关系如下: 订单3D 1------*画1------*线 我想这样保存一切: Order3d o=new Order3d(); //add data to order (lines and draws) Session s=HibernateUtils.getSessionFactory().openSession(); s.save(o); s.close(); 我没有运行时错误,但现在没
Order3d o=new Order3d();
//add data to order (lines and draws)
Session s=HibernateUtils.getSessionFactory().openSession();
s.save(o);
s.close();
我没有运行时错误,但现在没有插入我的行(仅保存order3d和drawfile)
以下是我的实体(显然,它们是POJO,所以我没有复制getter和setter):
(1) 订单和订单行之间存在双向关系。
Hibernate希望您像这样方便地为行分配顺序:
@Entity
@Table(name="ORDERS")
public class Order {
[...]
public void addLine(OrderLine line) {
line.setOrder(this);
myLines.add(line);
}
}
另请参见线程
(2) 不接受“订单”作为有效的表名。例如,选择“订单”
(3) 您忘记了订单行和绘图之间的一对一关系上的“级联”选项。考虑使用@嵌入而不是@ OnEthOne。
我总结了最简单的工作示例:
订单:
@Entity
@Table(name = "ORDERS")
public class Order {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column (name = "id")
private Long id;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name="line_id", nullable = false)
private Set<OrderLine> lines = new HashSet<OrderLine>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Set<OrderLine> getLines() {
return lines;
}
public void setLines(Set<OrderLine> lines) {
this.lines = lines;
}
public void addLine(OrderLine line) {
line.setOrder(this);
lines.add(line);
}
}
订单抽签(无论这是什么)
看起来在保存“ObjectLine”对象之前,“DrawLine”对象未被持久化。尝试将“cascade=CascadeType.ALL”添加到“OrderLine”类中的“drawine draw”中。
@Id@OneToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)@JoinColumn(name=“draw”)@Embedded private DrawFile draw代码>我仍然收到相同的错误,我添加了您的代码并替换了neworder().getmyline().add(sometline)代码>通过新订单().addLine(someline)代码>和我得到了相同的错误:(请将这些设置添加到您的hibernate配置中,并将日志输出附加到您的问题:hibernate.show\u sql=true hibernate.format\u sql=truehibernate:insert into order(交货、需求日期、估计日期、人工费用、修改、订单日期、人员、状态、差旅费用、有效日期)值(?,,,,,,,,,,,,,,,,?)休眠:选择orderlin_uu2.order、orderlin_u2.material、orderlin_u2.draw、orderlin_2.color、orderlin_2.depth作为深度3_2、orderlin_2.duration作为持续时间4_2、orderlin_2.height作为高度5_2、orderlin_2.Producted作为产量6_2、orderlin_2.quantity作为数量7_2、orderlin_2.width作为宽度8_2,其中orderlin_2.orderlin=和orderlin_2.material=?和orderlin\uu0.draw=?和orderlin\u0.color=?
我不知道您使用的是哪一个DB,但我怀疑代码中还有另一个小问题:“order”不是一个有效的表名。我为您准备了一个工作示例。请参阅更新的答案。我真正的表名不是order,而是Order3d(我认为这样更简单)。我添加了我的表创建说明。我不明白没有列名的代码(我也是一名hibernate初学者)如何使用映射。我是否需要在带有后缀_id?(order3d->order3d_id)的OrderLine表中更改order3d
@Entity
@Table(name="ORDERS")
public class Order {
[...]
public void addLine(OrderLine line) {
line.setOrder(this);
myLines.add(line);
}
}
@Entity
@Table(name = "ORDERS")
public class Order {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column (name = "id")
private Long id;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name="line_id", nullable = false)
private Set<OrderLine> lines = new HashSet<OrderLine>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Set<OrderLine> getLines() {
return lines;
}
public void setLines(Set<OrderLine> lines) {
this.lines = lines;
}
public void addLine(OrderLine line) {
line.setOrder(this);
lines.add(line);
}
}
@Entity
@Table(name = "ORDER_LINES")
public class OrderLine {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column (name = "id")
private Long id;
@ManyToOne(fetch = FetchType.EAGER)
private Order order;
@Column(name = "content")
private String content;
@Embedded
private OrderDraw draw;
public OrderDraw getDraw() {
return draw;
}
public void setDraw(OrderDraw draw) {
this.draw = draw;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
}
@Embeddable
public class OrderDraw {
private int width;
private int height;
public OrderDraw() {
this(0,0);
}
public OrderDraw(int width, int height) {
this.width = width;
this.height = height;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}