我目前的Hibernate项目存在一些映射问题。但首先,我会说我正在使用:
NetBeans 7.1.1
Java
JSF2
Oracle 10g
Apache Tomcat 7.0.22
Hibernate 3.2.1
我不得不说所有映射类都是由 Hibernate Reverse Engeneering Wizard 使用 Annotations 生成的,我的意思是,这些类是从数据库中的表构建的。我可以正确运行程序,除了关于在OneToMany关系中插入的部分,这一部分:
类
主
@Entity
@Table(name = "EXP_EXPEDIENTES")
public class ExpExpedientes implements Serializable {
@Id
@SequenceGenerator(name = "seq", sequenceName = "EXP_SEQ") //Triggers are disabled so Hibernate can manage the sequence generation.
@GeneratedValue(generator = "seq")
@Column(name = "ID_EXP")
private long idExpediente;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<ExpInstrucciones> expInstrucciones;
//more fields
//getters & setters
详细
@Entity
@Table(name = "EXP_INSTRUC")
public class ExpInstrucciones implements Serializable {
@Id
@SequenceGenerator(name="seq",sequenceName="EXP_SEQ")
@GeneratedValue(generator="seq")
@Column(name = "ID_INS")
private long idInstruccion;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ID_EXP", nullable=false)
private ExpExpedientes expExpedientes;
//more fields
//getters & setters
这样,我可以创建一个ExpExpediente对象和几个ExpInstrucciones对象。在分配了一些值之后,在尝试保存它们之前,我做了:
/* Previously, I've created these objects:
* expInst_1 = new ExpInstruccines();
* expInst_2 = new ExpInstrucciones();
*/
expInst_1.setExpExpedientes(expExpediente);
expInst_2.setExpExpedientes(expExpediente);
expExpediente.getExpInstrucciones().add(expInst_1);
expExpediente.getExpInstrucciones().add(expInst_2);
ExpedienteDAO.save(expExpediente);
DAO类中的 save 方法只包含 session.save(expExpediente)。这就是我的问题来了。读取Hibernate生成的sql,我发现Hibernate尝试执行下一句时出现 ORA-00942:表或视图不存在错误:
insert
into
EXP_EXPEDIENTES_EXP_INSTRUC
(EXP_EXPEDIENTES_ID_EXP, expInstrucciones_ID_INS)
values
(?, ?)
我认为错误与表 EXP_EXPEDIENTES_EXP_INSTRUC 有关,这显然在数据库中不存在。事实上,正如我已经说过的那样,映射是从数据库生成的。
现在,我的问题是:我应该创建那张桌子吗?或者所有这个问题都是由于配置错误造成的?我真的不知道该怎么做,所以任何帮助都会受到赞赏。
答案 0 :(得分:0)
您的映射应如下所示:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY,
mappedBy = "expExpedientes")
private Set<ExpInstrucciones> expInstrucciones;
双向关系的两侧应使用mappedBy
侧的@OneToMany
属性进行连接,否则ExpExpedientes
和ExpInstrucciones
之间会有两个单向关系,其中一个已实现使用外键和另一个 - 使用连接表(默认情况下)。
我猜这是 Hibernate Reverse Engeneering Wizard 的错误,你也应该检查这个问题的其他关系。