약 JPA
에 대해 배우고 데이터베이스를 만들고 일부 값을 삽입하는 작업이있었습니다. 나는 최근에 삽입 된 객체의 ID가 무엇인지 알아낼 수 있는지 궁금해했습니다. 따라서 flush
메서드 EntityManager
을 사용해야합니다. JPA 작업 단위 복제본에서 Null 또는 제로 키가 발생했습니다
예외가 발생한
널제로 기본 키를 얻었다. 문제는 내 데이터베이스가 모두
ID's
자동 증가 (나는 오라클 11G 익스프레스)를 사용하므로, 커밋하기 전에null
값을 가지며 트랜잭션을 롤백한다고 가정합니다.문제를 해결하려면 어떻게해야합니까?
이은 (ID 년대는 [오라클의 시퀀스 및 트리거] 자동 증가하고 있습니다) DB 수 있습니다 :
public class Client { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("JpaIntroductionPU"); EntityManager em = emf.createEntityManager(); EntityTransaction et = em.getTransaction(); et.begin(); Address ad1 = new Address(); ad1.setStreet("Skaraktki"); ad1.setCode("64-340"); em.persist(ad1); em.flush(); System.out.println(ad1.getAId()); et.commit(); } }
주소 클래스 당신은 당신의 주석을 필요
@Entity @Table(name = "ADDRESS") @NamedQueries({ @NamedQuery(name = "Address.findAll", query = "SELECT a FROM Address a"), @NamedQuery(name = "Address.findByAId", query = "SELECT a FROM Address a WHERE a.aId = :aId"), @NamedQuery(name = "Address.findByStreet", query = "SELECT a FROM Address a WHERE a.street = :street"), @NamedQuery(name = "Address.findByCode", query = "SELECT a FROM Address a WHERE a.code = :code")}) public class Address implements Serializable { private static final long serialVersionUID = 1L; // @Max(value=?) @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation @Id @Basic(optional = false) @Column(name = "A_ID") private BigDecimal aId; @Basic(optional = false) @Column(name = "STREET") private String street; @Basic(optional = false) @Column(name = "CODE") private String code; @OneToOne(cascade = CascadeType.ALL, mappedBy = "aId") private Employee employee; @OneToOne(cascade = CascadeType.ALL, mappedBy = "aId") private Department department; public Address() { } public Address(BigDecimal aId) { this.aId = aId; } public Address(BigDecimal aId, String street, String code) { this.aId = aId; this.street = street; this.code = code; } public BigDecimal getAId() { return aId; } public void setAId(BigDecimal aId) { this.aId = aId; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public Employee getEmployee() { return employee; } public void setEmployee(Employee employee) { this.employee = employee; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } @Override public int hashCode() { int hash = 0; hash += (aId != null ? aId.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { // TODO: Warning - this method won't work in the case the id fields are not set if (!(object instanceof Address)) { return false; } Address other = (Address) object; if ((this.aId == null && other.aId != null) || (this.aId != null && !this.aId.equals(other.aId))) { return false; } return true; } @Override public String toString() { return "jpaintroduction.Address[ aId=" + aId + " ]"; } }
후 내가 질문을 업데이트 CamiloBermúdez @ Address' – Camilo
'에 대한 코드입니다. – ashur