source

MYSQL 자동 증분 필드에 JPA 주석을 추가하는 방법

factcode 2022. 9. 30. 11:02
반응형

MYSQL 자동 증분 필드에 JPA 주석을 추가하는 방법

바로 요점은 오브젝트 Operator를 MySQL DB에 저장하는 것입니다.저장하기 전에 이 테이블에서 선택하려고 하면 동작합니다.db로의 접속도 마찬가지입니다.

오퍼레이터 오브젝트는 다음과 같습니다.

@Entity
public class Operator{

   @Id
   @GeneratedValue
   private Long id;

   private String username;

   private String password;


   private Integer active;

   //Getters and setters...
}

에는 JPA를 합니다.EntityManager의 »persist★★★★★★ 。

로그는 다음과 같습니다.

Hibernate: insert into Operator (active, password, username, id) values (?, ?, ?, ?)
com.mysql.jdbc.JDBC4PreparedStatement@15724a0: insert into Operator (active,password, username, id) values (0, 'pass', 'user', ** NOT SPECIFIED **)

제가 보기에 문제는 자동 증분을 사용하는 구성인데 어디에 있는지 알 수 없습니다.

여기서 본 몇 가지 트릭을 시도했습니다.MySQL auto_increment 프라이머리 키필드를 존중하지 않는 휴지 상태.하지만 아무것도 효과가 없었습니다.

그 밖에 필요한 설정 파일이 있으면 제공하겠습니다.

DDL:

CREATE TABLE `operator` ( 
`id` INT(10) NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(40) NOT NULL,
`last_name` VARCHAR(40) NOT NULL,
`username` VARCHAR(50) NOT NULL,
`password` VARCHAR(50) NOT NULL,
`active` INT(1) NOT NULL,
PRIMARY KEY (`id`)
)

MySQL을 AUTO_INCREMENT열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열, 열IDENTITY★★★★

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

'아까'를 했을 때 건가요?AUTO사용: MySQL 사용:

@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

이 값은 실제와 동등합니다.

@Id @GeneratedValue
private Long id;

될 것입니다., 휴지 에서는 but, ,, 지는 .idSQL insert sql sql sql 。어딘가에 뭔가 불일치가 있는 게 틀림없어요.

에서 MySQL MySQL 사투리를 지정했을 가능성이 ).MySQL5InnoDBDialect ★★★★★★★★★★★★★★★★★」MySQL5Dialect" " " " " " " 」

그리고 누가 테이블을 만들었나요?해당 DDL을 보여주실 수 있나요?

후속 조치:나는 너의 문제를 재현할 수 없다.Hibernate는 엔티티 코드와 DDL을 사용하여 MySQL을 사용하여 다음(예상) SQL을 생성합니다.

insert 
into
    Operator
    (active, password, username) 
values
    (?, ?, ?)

에 주의:id열이 예상대로 위 문장에 없습니다.

요약하자면, 코드, 표의 정의 및 사투리가 정확하고 일관성이 있어 효과가 있을 것입니다.문제가 해결되지 않으면 동기화가 되지 않거나(새로 빌드하거나 빌드 디렉토리를 다시 확인하는 등) 다른 문제가 있을 수 있습니다(로그에 의심스러운 점이 없는지 확인).

사투리에 대해서요.MySQL5Dialect ★★★★★★★★★★★★★★★★★」MySQL5InnoDBDialect가 후자를 입니다.ENGINE=InnoDB할 때 객체로 생성된 은 변경되지 않습니다.

MySQL을 사용할 때는 다음 방법만 사용할 수 있었습니다.

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

Pascal이 답변에서 언급한 다른 두 가지 접근 방식은 나에게 효과가 없었습니다.

JPA 2.0용 EclipseLink를 사용하는 사용자는 다음 두 가지 주석을 사용하여 JPA가 데이터를 유지하도록 합니다. 여기서 "MySequenceGenerator"는 생성기에 붙이는 이름이고 "myschema"는 시퀀스 객체를 포함하는 데이터베이스 스키마 이름이고 "mysequence"는 개체의 시퀀스 이름입니다.를 참조해 주세요.

@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="MySequenceGenerator")
@SequenceGenerator(allocationSize=1, schema="myschema",  name="MySequenceGenerator", sequenceName = "mysequence")

EclipseLink를 사용하는 사용자(및 기타 JPA 공급자)의 경우 allocationSize 속성을 데이터베이스 시퀀스에 대해 정의된 INCREENT 값에 일치하도록 설정하는 것이 중요합니다.그렇지 않으면 일반적인 지속성 오류가 발생하여 저처럼 추적하느라 많은 시간을 낭비하게 됩니다.다음은 이 과제를 해결하는 데 도움이 된 참조 페이지입니다.

http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey#Using_Sequence_Objects

또, 콘텍스트를 나타내기 위해서, 사용하고 있는 것은 다음과 같습니다.

Java 7 Glassfish 3.1 PostgreSQL 9.1 PrimeFaces 3.2/JSF 2.1

또한 느긋하게 DB에서 엔티티를 생성하는 마법사, 엔티티에서 컨트롤러, 엔티티에서 JSF를 사용하여 Netbeans에서 구축했습니다. 마법사는 시퀀스 기반 ID 열을 처리하는 방법을 모르기 때문에 이러한 주석을 수동으로 추가해야 합니다.

Hibernate "v3" "Mysql"을 GenerationType.AUTO으로는 「CHANGE」가 사용되기 때문입니다.GenerationType.IDENTITY에 가장

제5탄 GenerationType.AUTOGenerationType.TABLE이치

하려면 , 「 」를 사용합니다.GenerationType.IDENTITY(MySQL이 유일한 데이터베이스인 경우) 또는 다음 표기와 함께(여러 데이터베이스가 있는 경우)

@GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
@GenericGenerator(name = "native", strategy = "native")

ID 데이터형이 String이 아닌 Long인지 확인하십시오. 문자열일 경우 @GeneratedValue 주석이 작동하지 않고 SQL이 생성됩니다.

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private String id;

create table VMS_AUDIT_RECORDS (id **varchar(255)** not null auto_increment primary key (id))

그럴 필요가 있다

create table VMS_AUDIT_RECORDS (id **bigint** not null auto_increment primary key (id))

MariaDB 를 사용하고 있는 경우는, 이것은 유효합니다.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
private Long id;

자세한 것은, https://thorben-janssen.com/hibernate-tips-use-auto-incremented-column-primary-key/ 를 참조해 주세요.

모든 것을 시도했지만 여전히 할 수 없었습니다.mysql을 사용하고 있습니다.jpa는 휴지 상태이며, constructor에서 id 0의 값을 할당하여 문제를 해결했습니다.다음은 제 ID 선언 코드입니다.

@Id
@Column(name="id",updatable=false,nullable=false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

데이터베이스 작성 시 int 타입으로 ID를 정의했기 때문에 모델 클래스에서도 동일한 데이터 타입을 사용해야 합니다.또한 데이터베이스에서 ID를 자동 증분하도록 정의했으므로 모델 클래스에서 값 'GenerationType'을 전달하여 ID를 언급해야 합니다.AUTO'를 주석 @GeneratedValue 내의 '전략' 속성에 입력합니다.그러면 코드는 다음과 같습니다.

@Entity
public class Operator{

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int id;

  private String username;

  private String password;

  private Integer active;

  //Getters and setters...
}

pascal이 응답한 것과 동일합니다(사용할 필요가 있는 경우).어떤 이유로 AUTO를 응용 프로그램 속성에 추가하면 됩니다.

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto = update

올바른 데이터베이스에 연결되었는지 확인할 수 있습니다.같은 문제에 직면했지만 결국 다른 데이터베이스에 접속한 것을 알게 되었습니다.

ID는 DB2, MySQL, MS SQL Server, Sybase 및 HypersonicSQL의 ID 열을 지원합니다.반환되는 식별자는 long, short 또는 int 유형입니다.

상세정보 : http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/mapping.html#mapping-declaration-id

언급URL : https://stackoverflow.com/questions/4102449/how-to-annotate-mysql-autoincrement-field-with-jpa-annotations

반응형