문제

나는 다음을 활용한다:

넷빈스 IDE 6.7.1, 글래스 피쉬 v2.1, 오라클 10g XE, 자바 6 SE, 자바 5 EE,

상태 비저장 EJB 내부에서 고객 유형의 엔터티를 유지합니다. 주석이 있습니다.@SequenceGenerator(name="seq", sequenceName="cust_id_seq") 클래스의 경우 기본 키는 시퀀스 cust_id_seq에서 데이터베이스에 자동 생성되지만 첫 번째 고객을 유지할 때 기본 키는 10000이 아닌 9951이고 두 번째 고객의 기본 키는 9952입니다.두 명의 고객을 유지한 후 GlassFish v2.1의 출력은 다음과 같습니다.

애플리케이션 서버 시작이 완료되었습니다.

내 아이디는 다음과 같습니다:0

TopLink, 버전:Oracle TopLink Essentials - 2.1(빌드 b31g-fcs(2009년 10월 19일))

섬기는 사람:알려지지 않은 파일:/C:/Documents%20and%20Settings/IOANNIS_PAPAIOANNOU/My%20Documents/NetBeansProjects/VideoClub/dist/gfdeploy/VideoClub-ejb_jar/-vc_pu 로그인 성공

내 아이디는 다음과 같습니다:9951

내 아이디는 다음과 같습니다:0

내 아이디는 다음과 같습니다:9952

@Entity
@Table(name = "customer")
@SequenceGenerator(name="seq", sequenceName="cust_id_seq")
public class Customer implements Serializable
{

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
@Column(name="CUST_ID")
private int id;

@Column(name = "phone_number")
private int phoneNumber;

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;

@Column(name = "credit")
private int credit;

@OneToMany    
private Collection<CustRentMovie> rents = new ArrayList<CustRentMovie>();

public int getCredit()
{
    return credit;
}

public void setCredit(int credit)
{
    this.credit = credit;
}

public String getFirstName()
{
    return firstName;
}

public void setFirstName(String firstName)
{
    this.firstName = firstName;
}

public int getId()
{
    return id;
}

public void setId(int id)
{
    this.id = id;
}

public String getLastName()
{
    return lastName;
}

public void setLastName(String lastName)
{
    this.lastName = lastName;
}

public int getPhoneNumber()
{
    return phoneNumber;
}

public void setPhoneNumber(int phoneNumber)
{
    this.phoneNumber = phoneNumber;
}

public Collection<CustRentMovie> getRents()
{
    return rents;
}

public void setRents(Collection<CustRentMovie> rents)
{
    this.rents = rents;
}


}

EJB의 코드:

@Stateless
public class ClerkSessionBean implements ClerkSessionRemote
{

@PersistenceContext(unitName = "vc_pu")
private EntityManager em;

public int writeCustomer(AlmostCustomer almostCustomer)
{

    Customer customer = new Customer();
    System.out.println("My id is: " + customer.getId());
    customer.setFirstName(almostCustomer.getFirstName());
    customer.setLastName(almostCustomer.getLastName());
    customer.setPhoneNumber(almostCustomer.getPhoneNumber());
    em.persist(customer);
    System.out.println("My id is: " + customer.getId());
    return customer.getId();
}
}

데이터베이스를 생성하는 스크립트의 일부:

CREATE table customer
(
cust_id NUMBER(5),
phone_number NUMBER(10) NOT NULL,
first_name VARCHAR2(12) NOT NULL,
last_name VARCHAR2(30) NOT NULL,
-- Τα χρήματα που έχει ένας πελάτης στο λογαριασμό του.
credit NUMBER(5, 2) DEFAULT 0 NOT NULL,
CONSTRAINT cust_pk PRIMARY KEY (cust_id),
-- Μόνο ένας λογαριασμός για κάθε σπίτι.
CONSTRAINT phone_unique UNIQUE (phone_number)
)
/

DROP SEQUENCE cust_id_seq
/

CREATE SEQUENCE cust_id_seq MINVALUE 10000 MAXVALUE 99999 INCREMENT BY 1 START WITH 10000 NOCACHE  NOCYCLE ORDER

/

야니스 P.

도움이 되었습니까?

해결책 2

주석 @SequenceGenerator의 고객 엔티티에서 Atribute 할당을 추가합니다. 이제 기본 키는 10000에서 시작합니다.

@Entity
@Table(name = "customer")
@SequenceGenerator(name="seq", sequenceName="cust_id_seq", allocationSize=1)
public class Customer implements Serializable
{

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
    @Column(name="CUST_ID")
    private int id;  
...
}
.

다른 팁

내 생각엔 네가 바뀌어야 할 것 같아 CREATE SEQUENCE cust_id_seq ... INCREMENT BY1 에게 ... INCREMENT BY50.이유는 다음과 같습니다.

선언된 시퀀스 증분은 다음과 일치해야 합니다. @SequenceGenerator'에스 allocationSize 매개변수. allocationSize 지정되지 않았으므로 기본값은 50입니다.하지만 사실은 INCREMENT BY 50이 아니라 단지 1입니다.그래서 사이에 불일치가 있습니다. allocationSize 그리고 진짜 INCREMENT BY.

이러한 불일치로 인해 문제가 발생할 수 있는 방법은 다음과 같습니다.TopLink Essentials(TLE) 통화 NEXTVAL() ~에 cust_id_seq.시퀀스는 10000 + 1을 반환합니다.TLE는 시퀀스가 ​​50씩 증가했다고 가정합니다(기본 JPA allocationSize) 대신 1(실제 금액)을 사용합니다.TLE 빼기 allocationSize = 10001에서 50을 거쳐 9951을 얻습니다.

그건 그렇고, 그렇게 할 자유가 있다면 TLE의 후속 제품으로 업그레이드하는 것을 고려하십시오. EclipseLink (그리고 글래스피시 v3).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top