我有两个对象Mat和MatImage,父母和孩子resp。 MatImage的主键是Mat的id,它们通过一对一的关系进行连接。@PrimaryKeyJoinColumn与Bidirectional @OneToOne关系
如果我正确理解双向关系,那么如果我执行类似matImage.setMat(mat)的操作,子对象将知道父对象。我认为在这一点上主要关键将被填补,但事实并非如此。我知道这是因为当sql尝试以#0作为matId插入MatImage时抛出异常。
另一个问题是n + 1问题。我想懒惰地加载子对象,因为不是所有的垫都有matimage。我可以尝试将@OneToOne更改为@ManyToOne,但不知道如何双向完成。任何帮助,将不胜感激。谢谢。
这里是实体:
// Mat
@Entity
@Table(name="mat")
public class Mat implements Serializable {
@Id
@GeneratedValue(generator="SeqMat")
@SequenceGenerator(name="SeqMat", sequenceName="seq_mat_id")
int id
@OneToOne(mappedBy="mat", optional=true, fetch=FetchType.LAZY)
@PrimaryKeyJoinColumn(name="id", referencedColumnName="matId")
@Cascade([ALL, DELETE_ORPHAN])
MatImage matImage
int matTemplateId
int number
...
}
// MatImage
@Entity
@Table(name="matimage")
public class MatImage implements Serializable {
@Id
int matId
@OneToOne(optional=true, fetch=FetchType.LAZY)
@JoinColumn(name="matId", referencedColumnName="id")
Mat mat
@Column(name="img_eventid")
int eventId
...
}
你使用Oracle ???你说过:当SQL尝试以#0作为matId插入MatImage时,SQL会引发异常。好的,但你能展示如何保存一个MatImage对象? – 2010-01-04 21:09:32
实际上你的问题是什么?清楚说明。 – Bozho 2010-01-05 04:50:58
Mat设置为MatImage之前保存了Mat吗? – EJB 2010-01-05 09:36:07