我有两个类Error和MainError(*-*与MainError的关联是关联的所有者)
我想将数据持久化在数据库中,我不能使用Persist Cascade,因为我有很多重复的对象,并且我想识别出重复的对象并将它们与持久对象相关联(Error和MainError的名称是唯一的)
Error error1 = new Error ("ERR1");
Error error2 = new Error ("ERR2");
Error error3 = new Error ("ERR3");
Error error4 = new Error ("ERR4");
Error error5 = new Error ("ERR5");
Error error6 = new Error ("ERR1");
MainError mainError1 = new MainError("MAIN1");
MainError mainError2 = new MainError("MAIN2");
MainError mainError3 = new MainError("MAIN2");
mainError1.addError(error1);
mainError1.addError(error2);
mainError1.addError(error3);
mainError1.addError(error6);
mainError2.addError(error1);
mainError2.addError(error4);
mainError3.addError(error5);
//persisting Error and MainError
例如,如果我已经在数据库中保留了错误error1 =新错误(“ ERR1”),然后我要保留错误error6 =新错误(“ ERR1”);我希望我的应用程序认识到它已经存在,并将“ ERR1”关联到相应的MainError。
我想我将需要创建一个方法findByName来了解Error / MainError的名称是否已经保存,如果是,则返回此对象,对其进行处理并合并?
我希望我的问题不会引起混淆
非常感谢你
最佳答案
正如您在问题中提到的那样,您可以手动检查数据库中是否存在数据?为此,您还可以将该列设置为唯一约束。
替代解决方案:
在您的情况下,数据库设计应如下所示:
错误:
id varchar (PK)
mainerror:
id varchar (PK)
error_id varchar (FK)
实体类应该是这样的:
错误.java
@Entity
public class Error {
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 2147483647)
@Column(nullable = false, length = 2147483647)
private String id;
@OneToMany(mappedBy = "errorId", fetch = FetchType.LAZY)
private Collection<MainError> mainErrorCollection;
public Error() {
}
public Error(String id) {
this.id = id;
}
//getter and setter methods
}
MainError.java
@Entity
@Table(name = "main_error")
public class MainError {
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 2147483647)
@Column(nullable = false, length = 2147483647)
private String id;
@JoinColumn(name = "error_id", referencedColumnName = "id")
@ManyToOne(fetch = FetchType.LAZY)
private Error errorId;
public MainError() {
}
public MainError(String id) {
this.id = id;
}
//getter and setter methods
}
您应该通过对main_error表进行id和error_id的联合PK来防止添加重复记录。
关于java - 在没有Cascade Persist的情况下使用JPA,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31946601/