2016-10-29 17 views
0

私はREST-apiを介して新しいEmployee-entityをデータベースに追加しようとしています。 Employee-entityにはCityプロパティが含まれています。これはManyToOne関係です。新しい(従業員ではない)都市を持つ新しい従業員を挿入すると、正常に動作します。しかし、既存の都市の新しい従業員を追加すると、このエラーが発生します。CascadeType.ALLは子要素を更新しません

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1000' for key 'PRIMARY' 

My CascadeTypeがALLに設定されています。 SAVE_UPDATEに変更すると、既存の都市で新しい従業員を挿入するとうまく動作しますが、新しい都市で新しい従業員を挿入すると機能しません。

従業員:

package be.pxl.backend.entity; 

import java.util.Date; 
import java.util.List; 
import javax.persistence.*; 
import javax.persistence.Entity; 
import javax.persistence.Table; 
import org.hibernate.annotations.*; 
import org.hibernate.annotations.CascadeType; 

@Entity 
@Table(name="Employees") 
public class Employee { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int employee_id; 
    private String username; 
    private String password; 
    private String salt; 
    private String surName; 
    private String name; 
    private String street; 
    @Column(name="house_nr") 
    private String houseNr; 
    @ManyToOne 
    @Cascade (value={CascadeType.MERGE, CascadeType.PERSIST}) 
    private City city; 
    private Date date_employment; 
    private String mobile_phone; 
    private String telephone_number; 
    private String email; 
    private String sex; 
    private Boolean status; 
    @OneToMany(mappedBy="employee") 
    private List<Login> logins; 
    @OneToMany(mappedBy = "employee") 
    private List<SensorUsage> usages ; 

    public List<Login> getLogins() { 
     return logins; 
    } 
    public Boolean getStatus() { 
     return status; 
    } 
    public int getEmployee_id() { 
     return employee_id; 
    } 
    public String getUsername() { 
     return username; 
    } 
    public String getPassword() { 
     return password; 
    } 
    public String getSalt() { 
     return salt; 
    } 
    public String getSurName() { 
     return surName; 
    } 
    public String getName() { 
     return name; 
    } 
    public String getStreet() { 
     return street; 
    } 
    public String getHouseNr() { 
     return houseNr; 
    } 
    public City getCity() { 
     return city; 
    } 
    public Date getDate_employment() { 
     return date_employment; 
    } 
    public String getMobile_phone() { 
     return mobile_phone; 
    } 
    public String getTelephone_number() { 
     return telephone_number; 
    } 
    public String getEmail() { 
     return email; 
    } 
    public String getSex() { 
     return sex; 
    } 

    public void setStatus(boolean status) { this.status = status; } 

} 

市:

package be.pxl.backend.entity; 

import javax.persistence.*; 
import java.util.List; 

@Entity 
@Table(name="Cities") 
public class City { 

    @Id 
    private String postal_code; 
    private String city; 
    @OneToMany(mappedBy = "city") 
    private List<Destination> destinations; 
    @OneToMany(mappedBy = "city") 
    private List<Employee> employees; 

    public String getPostal_code() { 
     return postal_code; 
    } 
    public String getCity() { 
     return city; 
    } 

} 

私は存続する場所です:

package be.pxl.backend.repository; 

import java.util.List; 

import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.data.jpa.repository.Query; 
import org.springframework.data.repository.query.Param; 
import org.springframework.stereotype.Repository; 
import be.pxl.backend.entity.*; 

@Repository 
public interface EmployeeRepository extends JpaRepository<Employee, Integer> { 
    @Query("from Employee e where e.username = :username") 
    Employee getEmployeeByUsername(@Param("username")String username); 
} 

ヘルプをいただければ幸いです! @ManyToOneアノテーションで、それに注釈を付ける、もちろん、あなたを

ソースで

/所有エンティティ(外部キーを持つエンティティ):あなたがこれを行う必要があります一つの団体に双方向の多くを設定するために

+0

あなたのコードを表示してください。 – davidxxx

+0

@davidxxx done! –

+0

従業員をどのように救いますか? –

答えて

1

@JoinColumnアノテーションでアノテートしてください。あなたのケースでは、これはEmployeeエンティティ上のようになります方法です。

@Entity 
    @Table(name="Employees") 
    public class Employee { 

    @ManyToOne 
    @JoinColumn(name = "your_fk_column") 
    private City city; 
    } 

そして、あなたの街のエンティティに行い、この:CascadeType.ALLはあなたの例を参照してくださいすることを行動の

@Entity 
@Table(name="Cities") 
public class City { 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "city") 
    private List<Employee> employees; 
} 

ワン従業員を保存/保存しようとするときに、それはCascadeType.ALLのために関連付けられた都市で同じことをします。

現在、既存の都市に新しい従業員を保存しようとすると、新しい従業員を保存しようとするとHibernateが試みるので、あなたが得ているエラーを得ることはかなり明らかです。既存の都市を保存しますが、Hibernateは文句なぜある同じPK二回と同じレコードを保存することはできません。

直前
Duplicate entry '1000' for key 'PRIMARY' 

あなたは別の主キーを持つすべて同じ都市レコードの後に​​したい場合は、エンティティを保存し、都市PKをヌルに設定します。

または、私のように都市のエンティティにカスケードを移動してください。 従業員を救うときはいつでも、街は永続することはありません。

または、カスケードタイプをすべてから、カスケードタイプ(persist以外)に変更します。

関連する問題