これは私の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をそのまま維持するための解決策を見つけようとしています