私は非常に特別な設定をしています。Java ですべてのクラスを作成し、アプリケーションでそれらを接続します (複数の ManyToOne 関係)。
次に、オブジェクトを反復処理してデータベースに保存したいと思います。場合によっては、オブジェクトがすでにデータベースにある場合、そのオブジェクトを再び永続化するべきではありません。
私は hashCode() と equals() メソッドを正しく実装しましたが、それでも私の em.merge() はオブジェクトを挿入します。
また:
私はいくつかのオブジェクトを作成します。つまり、何人かのプレーヤーを作成し、彼らがどのチームにいるかを設定します。チームは Java では異なるオブジェクトである可能性がありますが、それらの「等しい」方法によれば、それらは同じです。したがって、プレーヤーを保存すると、それに応じてチームを保存する必要がありますが (これは機能します)、チームがデータベースに存在する場合 (equals メソッドに従って)、再度挿入する必要はありませんが、関係を設定する必要があります。コース。
私は何を間違っていますか?さらに情報が必要ですか?
private static void saveModels(final Set<?> models) {
EntityManagerFactory factory = null;
factory = Persistence.createEntityManagerFactory("sqlite");
EntityManager manager = factory.createEntityManager();
manager.getTransaction().begin();
for (Object object : models) {
manager.merge(object);
}
manager.getTransaction().commit();
manager.close();
factory.close();
}
編集
@Entity
public class Team {
private long id;
private String description;
@Id
@GeneratedValue
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description= description;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + description.length();
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Team other = (Team) obj;
if (!description.equals(other.getDescription())) {
return false;
}
return true;
}
}
@Entity
public class Player {
private long id;
private Team team;
private String name;
@Id
@GeneratedValue
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, targetEntity = Team.class)
@JoinColumn(name = "team_id")
public Team getTeam() {
return team;
}
public void setTeam(Team team) {
this.team = team;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
return name.length();
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Player)) {
return false;
}
Player other = (Player) obj;
return other.getName().equals(name);
}
}