Java 使用没有级联的JPA
我有两个类Error和MainError(*-*与MainError的关联是关联的所有者) 我想在数据库中持久化数据,但无法使用持久化级联,因为我有许多重复对象,我想识别重复对象并将其与持久化对象关联(Error和MainError的名称是唯一的) 例如,如果我已经在数据库中保留了error1=newerror(“ERR1”),那么我想保留error6=newerror(“ERR1”);我希望我的应用程序能够识别这一点,并将“ERR1”与相应的MainError关联起来。 我想我需要创建一个findByName方法来知道Error/MainError的名称是否已经被持久化,如果是,返回这个对象,处理它并合并它 我希望我的问题不会令人困惑Java 使用没有级联的JPA,java,hibernate,jpa,Java,Hibernate,Jpa,我有两个类Error和MainError(*-*与MainError的关联是关联的所有者) 我想在数据库中持久化数据,但无法使用持久化级联,因为我有许多重复对象,我想识别重复对象并将其与持久化对象关联(Error和MainError的名称是唯一的) 例如,如果我已经在数据库中保留了error1=newerror(“ERR1”),那么我想保留error6=newerror(“ERR1”);我希望我的应用程序能够识别这一点,并将“ERR1”与相应的MainError关联起来。 我想我需要创建一个fi
非常感谢正如您在问题中提到的,您可以手动检查数据库中是否存在数据?为此,还可以将该列设置为uniq约束 替代解决方案: 在您的情况下,数据库设计应如下所示: 错误:
id varchar (PK)
id varchar (PK)
error_id varchar (FK)
main错误:
id varchar (PK)
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
}
@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
}
您应该通过对主错误表的id和错误id进行联合PK来防止添加重复记录。谢谢您的回答,但我还不了解您的解决方案,JoinColumn的目的是什么?(当我指定OneToMany(mappedBy..)时,已经对FK进行了约束)对吗?我只是想告诉你,你可以在每个persist方法之前手动检查,比如
findByName
,或者让数据库处理重复记录,方法是将该列作为主键或uniq键
。答案中的Java类只是为了演示结构。你可以根据自己的要求更改它uirement..也可参考