0

これは私のSQLテーブル構造です:

create table TBL_EMPLOYEE_FIVE(
    EMP_ID integer generated always as identity(start with 50, increment by 4),
    NAME varchar(50),
    COUNTRY varchar(50),
    MGR_ID integer,
    MGR_COUNTRY varchar(50),
    constraint PK_COMPOSIT_001AD primary key(EMP_ID,COUNTRY),
    constraint  FK_COMPO_00123 foreign key(MGR_ID,MGR_COUNTRY) references TBL_EMPLOYEE_FIVE
)

そして、これは私のエンティティマッピングです:

@Entity
@Table(name="TBL_EMPLOYEE_FIVE")
@IdClass(EmployeeId.class)
public class EmployeeOne implements Serializable{

    public EmployeeOne(){}
    public EmployeeOne(String employeeName,String empCountry){
        this.empCountry = empCountry;
        this.employeeName = employeeName;
    }

    public EmployeeOne(String employeeName,String empCountry,EmployeeOne manager){
        this.empCountry = empCountry;
        this.employeeName = employeeName;
        this.manager = manager;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="EMP_ID")
    private Integer employeeId;

    @Id
    @Column(name="COUNTRY")
    private String empCountry;

    @Column(name="NAME")
    private String employeeName;

    @ManyToOne( cascade= {CascadeType.PERSIST, CascadeType.PERSIST},
            fetch= FetchType.LAZY,
            targetEntity=EmployeeOne.class)
            @JoinColumns({
            @JoinColumn(name="MGR_ID",referencedColumnName="EMP_ID"),
            @JoinColumn(name="MGR_COUNTRY",referencedColumnName="COUNTRY")
    })
    private EmployeeOne manager;

    @OneToMany(cascade={CascadeType.PERSIST, CascadeType.PERSIST},mappedBy="manager")
    private Set<EmployeeOne> employees;
// getters and setters,
}

これは埋め込まれた ID マッピングです。

@Embeddable
public class EmployeeId implements Serializable{

    public EmployeeId(){}

    public EmployeeId(Integer employeeId,String empCountry){
       this.employeeId = employeeId;
       this.empCountry = empCountry;
    }

    @Column(name="EMP_ID")
    private Integer employeeId;

    @Column(name="COUNTRY")
    private String empCountry;
// only getters and implementation of hashcode and equals method
}

そして、これが私のメインメソッドで実行しようとしているものです:

EmployeeOne manager = new EmployeeOne("Yousuf Ahmadinejad", "IRAN");
em.persist(manager);

しかし、ここで例外が発生しています

Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: Attempt to modify an identity column 'EMP_ID'. 

例外を理解していなかったわけではありませんが、

しかし、そもそもなぜこの例外が発生したのでしょうか? 私はすでに Empid の @GenerateValue で注釈を付けており、empId を手動で設定していません。この例外は、主キーを empId と国として組み合わせたために発生し、empId は Identity を使用して自動生成されるため、例外が発生しますか?

何がうまくいかないのか教えてください

ここでもう 1 つ追加したいのは、EmployeeId.java の @Column および @Embeddeble アノテーションを削除して実行すると、次の例外が発生することです。

Caused by: org.hibernate.PropertyAccessException: could not set a field value by reflection setter of com.entities.derived.EmployeeId.employeeId

したがって、従業員が自動生成されたIDをそのまま維持するための解決策を見つけようとしています

4

1 に答える 1

0

まず、Hibernate は複合キーの ID を生成しないため、EmployeeOne を次のように変更する必要があります。

@Id
//@GeneratedValue(strategy=GenerationType.IDENTITY) remove this line
@Column(name="EMP_ID")
private Integer employeeId;

EmployeeId2 つ目は、複合キー クラスを実装する方法ではありません。参照: https://stackoverflow.com/a/3588400/1981720

第 3 に、Hibernate ではなく、データベースによって例外がスローされます。別のデータベースで同じ例外が発生しているかどうかを確認してください。

于 2013-04-10T18:07:15.183 に答える