是否可以指定使用 Hibernate 将 id 自动递增非空主键设置为 @ManyToMany 关系映射?
Is it possible specify to set an id auto increment not null primary key into a @ManyToMany relationship mapping using Hibernate?
我正在开发一个 Spring 启动应用程序,使用 Spring Data JPA 和 Hibernate 映射预先存在的数据库 tables。我发现 @ManyToMany 关系有些困难,因为相关关系 table 有一个 bigint autoincrement NOT NULL PK.
基本上这是我数据库中的关系 table:
CREATE TABLE IF NOT EXISTS public.portal_user_user_type
(
id bigint NOT NULL,
portal_user_id_fk bigint NOT NULL,
user_type_id_fk bigint NOT NULL,
CONSTRAINT portal_user_user_type_pkey PRIMARY KEY (id),
CONSTRAINT portal_user_user_type_to_portal_user FOREIGN KEY (portal_user_id_fk)
REFERENCES public.portal_user (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION,
CONSTRAINT portal_user_user_type_to_user_type FOREIGN KEY (user_type_id_fk)
REFERENCES public.user_type (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
前面的table是我多对多关联tableportal_user table 和 ** user_type** table。这是因为一个用户可以有多个用户类型,一个用户类型可以与不同的用户相关。
所以我把它映射到我的 User class (映射 portal_user table), 这样:
@SpringBootTest()
@ContextConfiguration(classes = GetUserWsApplication.class)
@TestMethodOrder(OrderAnnotation.class)
public class UserRepositoryTest {
@Autowired
private UsersRepository userRepository;
@Test
@Order(1)
public void testInsertUser() {
User user = new User("Mario", null, "Rossi", 'M', new Date(), "XXX", "xxx@gmail.com", "329123456", new Date());
Set<Address> addressesList = new HashSet<>();
addressesList.add(new Address("Italy", "RM", "00100", "Via XXX 123", "near YYY", user));
user.setAddressesList(addressesList);
Set<UserType> userTypesList = new HashSet<>();
UserType userType1 = new UserType("ADMIN", "Admin user type !!!");
UserType userType2 = new UserType("USER", "Just a simple user...");
userTypesList.add(userType1);
userTypesList.add(userType2);
user.setUserTypes(userTypesList);
userRepository.save(user);
assertTrue(true);
}
}
问题出在这个测试方法上,当执行 save() 方法时,我得到了这个输出,但有以下异常:
Hibernate:
insert
into
portal_user
(birthdate, contact_number, created_at, e_mail, first_name, middle_name, sex, surname, tex_code)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate:
insert
into
address
(country, notes, province, street, fk_user_id, zip_code)
values
(?, ?, ?, ?, ?, ?)
Hibernate:
insert
into
user_type
(description, type_name)
values
(?, ?)
Hibernate:
insert
into
user_type
(description, type_name)
values
(?, ?)
Hibernate:
insert
into
portal_user_user_type
(portal_user_id_fk, user_type_id_fk)
values
(?, ?)
2021-11-08 12:58:50.859 WARN 10724 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 23502
2021-11-08 12:58:50.863 ERROR 10724 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: null value in column "id" of relation "portal_user_user_type" violates not-null constraint
Detail: Failing row contains (null, 13, 1).
2021-11-08 12:58:50.958 INFO 10724 --- [ main] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements
这是因为它似乎无法将记录插入我的 portal_user_user_type 多对多关系 table 因为 ID table 的字段不是 NULL。
我知道一个可能的解决方案是删除这个 ID 主键字段并创建一个复合 PK(由我的两个字段组成:portal_user_id_fk 和 user_type_id_fk)。
它可以工作,但我害怕尝试在这个单独的 id PK 字段中进行管理。
是否可以指定我的 @ManyToMany 注解来生成一个自增 id 字段?或者有什么可能的解决方案? (我知道我也可以尝试使用两个 @OneToMany 和关联的另一个实体 table 来实现 多对多 关系, 但我害怕不要使用这种方法以避免过于复杂)
只需让 portal_user_user_type
table 中的 id
自动递增:id bigint NOT NULL GENERATED ALWAYS AS IDENTITY...
。然后 Hibernate 将生成一个有效的插入语句,而无需提及 id。
您不能直接将自动增量 属性 添加到您的 @ManyToMany
注释中,而应该将自动增量 ID 添加到您加入的数据库 table 并添加一个 @GeneratedValue
带有 Identity
生成类型的注释如下:
@Entity
@Table(name = "portal_user_user_type")
public class PortalUserUserType{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
我正在开发一个 Spring 启动应用程序,使用 Spring Data JPA 和 Hibernate 映射预先存在的数据库 tables。我发现 @ManyToMany 关系有些困难,因为相关关系 table 有一个 bigint autoincrement NOT NULL PK.
基本上这是我数据库中的关系 table:
CREATE TABLE IF NOT EXISTS public.portal_user_user_type
(
id bigint NOT NULL,
portal_user_id_fk bigint NOT NULL,
user_type_id_fk bigint NOT NULL,
CONSTRAINT portal_user_user_type_pkey PRIMARY KEY (id),
CONSTRAINT portal_user_user_type_to_portal_user FOREIGN KEY (portal_user_id_fk)
REFERENCES public.portal_user (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION,
CONSTRAINT portal_user_user_type_to_user_type FOREIGN KEY (user_type_id_fk)
REFERENCES public.user_type (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
前面的table是我多对多关联tableportal_user table 和 ** user_type** table。这是因为一个用户可以有多个用户类型,一个用户类型可以与不同的用户相关。
所以我把它映射到我的 User class (映射 portal_user table), 这样:
@SpringBootTest()
@ContextConfiguration(classes = GetUserWsApplication.class)
@TestMethodOrder(OrderAnnotation.class)
public class UserRepositoryTest {
@Autowired
private UsersRepository userRepository;
@Test
@Order(1)
public void testInsertUser() {
User user = new User("Mario", null, "Rossi", 'M', new Date(), "XXX", "xxx@gmail.com", "329123456", new Date());
Set<Address> addressesList = new HashSet<>();
addressesList.add(new Address("Italy", "RM", "00100", "Via XXX 123", "near YYY", user));
user.setAddressesList(addressesList);
Set<UserType> userTypesList = new HashSet<>();
UserType userType1 = new UserType("ADMIN", "Admin user type !!!");
UserType userType2 = new UserType("USER", "Just a simple user...");
userTypesList.add(userType1);
userTypesList.add(userType2);
user.setUserTypes(userTypesList);
userRepository.save(user);
assertTrue(true);
}
}
问题出在这个测试方法上,当执行 save() 方法时,我得到了这个输出,但有以下异常:
Hibernate:
insert
into
portal_user
(birthdate, contact_number, created_at, e_mail, first_name, middle_name, sex, surname, tex_code)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate:
insert
into
address
(country, notes, province, street, fk_user_id, zip_code)
values
(?, ?, ?, ?, ?, ?)
Hibernate:
insert
into
user_type
(description, type_name)
values
(?, ?)
Hibernate:
insert
into
user_type
(description, type_name)
values
(?, ?)
Hibernate:
insert
into
portal_user_user_type
(portal_user_id_fk, user_type_id_fk)
values
(?, ?)
2021-11-08 12:58:50.859 WARN 10724 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 23502
2021-11-08 12:58:50.863 ERROR 10724 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: null value in column "id" of relation "portal_user_user_type" violates not-null constraint
Detail: Failing row contains (null, 13, 1).
2021-11-08 12:58:50.958 INFO 10724 --- [ main] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements
这是因为它似乎无法将记录插入我的 portal_user_user_type 多对多关系 table 因为 ID table 的字段不是 NULL。
我知道一个可能的解决方案是删除这个 ID 主键字段并创建一个复合 PK(由我的两个字段组成:portal_user_id_fk 和 user_type_id_fk)。 它可以工作,但我害怕尝试在这个单独的 id PK 字段中进行管理。
是否可以指定我的 @ManyToMany 注解来生成一个自增 id 字段?或者有什么可能的解决方案? (我知道我也可以尝试使用两个 @OneToMany 和关联的另一个实体 table 来实现 多对多 关系, 但我害怕不要使用这种方法以避免过于复杂)
只需让 portal_user_user_type
table 中的 id
自动递增:id bigint NOT NULL GENERATED ALWAYS AS IDENTITY...
。然后 Hibernate 将生成一个有效的插入语句,而无需提及 id。
您不能直接将自动增量 属性 添加到您的 @ManyToMany
注释中,而应该将自动增量 ID 添加到您加入的数据库 table 并添加一个 @GeneratedValue
带有 Identity
生成类型的注释如下:
@Entity
@Table(name = "portal_user_user_type")
public class PortalUserUserType{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...