单向关联java_java – 使用单向或双向关系的不同行为

我想坚持一个拥有一些资源(内联或附件)的邮件实体.首先,我将它们视为双向关系:

@Entity

public class Mail extends BaseEntity {

@OneToMany(mappedBy = "mail", cascade = CascadeType.ALL, orphanRemoval = true)

private List resource;

private String receiver;

private String subject;

private String body;

@Temporal(TemporalType.TIMESTAMP)

private Date queued;

@Temporal(TemporalType.TIMESTAMP)

private Date sent;

public Mail(String receiver, String subject, String body) {

this.receiver = receiver;

this.subject = subject;

this.body = body;

this.queued = new Date();

this.resource = new ArrayList<>();

}

public void addResource(String name, MailResourceType type, byte[] content) {

resource.add(new MailResource(this, name, type, content));

}

}

@Entity

public class MailResource extends BaseEntity {

@ManyToOne(optional = false)

private Mail mail;

private String name;

private MailResourceType type;

private byte[] content;

}

当我救了他们:

Mail mail = new Mail("asdasd@asd.com", "Hi!", "...");

mail.addResource("image", MailResourceType.INLINE, someBytes);

mail.addResource("documentation.pdf", MailResourceType.ATTACHMENT, someOtherBytes);

mailRepository.save(mail);

执行了三个插入:

INSERT INTO MAIL (ID, BODY, QUEUED, RECEIVER, SENT, SUBJECT) VALUES (?, ?, ?, ?, ?, ?)

INSERT INTO MAILRESOURCE (ID, CONTENT, NAME, TYPE, MAIL_ID) VALUES (?, ?, ?, ?, ?)

INSERT INTO MAILRESOURCE (ID, CONTENT, NAME, TYPE, MAIL_ID) VALUES (?, ?, ?, ?, ?)

然后我认为仅使用OneToMany关系会更好.无需在每个MailResource中保存哪个Mail:

@Entity

public class Mail extends BaseEntity {

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)

@JoinColumn(name = "mail_id")

private List resource;

...

public void addResource(String name, MailResourceType type, byte[] content) {

resource.add(new MailResource(name, type, content));

}

}

@Entity

public class MailResource extends BaseEntity {

private String name;

private MailResourceType type;

private byte[] content;

}

生成的表完全相同(MailResource有一个FK到Mail).问题是执行的SQL:

INSERT INTO MAIL (ID, BODY, QUEUED, RECEIVER, SENT, SUBJECT) VALUES (?, ?, ?, ?, ?, ?)

INSERT INTO MAILRESOURCE (ID, CONTENT, NAME, TYPE) VALUES (?, ?, ?, ?)

INSERT INTO MAILRESOURCE (ID, CONTENT, NAME, TYPE) VALUES (?, ?, ?, ?)

UPDATE MAILRESOURCE SET mail_id = ? WHERE (ID = ?)

UPDATE MAILRESOURCE SET mail_id = ? WHERE (ID = ?)

为什么这两个更新?我正在使用EclipseLink,使用另一个JPA提供程序作为Hibernate,这种行为是否相同?哪种解决方案更好?

更新:

? – 如果我不使用@JoinColumn,EclipseLink会创建三个表:MAIL,MAILRESOURCE和MAIL_MAILRESOURCE.我认为这是完全逻辑的.但是对于@JoinColumn,它只有足够的信息来创建两个表,在我看来,只进行插入,没有更新.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值