带有@JoinTable 的单向@OneToMany 不更新连接 table
Unidirectional @OneToMany with @JoinTable not updating the join table
我正在尝试使用 Spring Boot、JPA、QueryDsl 和内存 H2 数据库实现单向一对多映射。当我通过 schema.sql 插入数据时,文件关系被正确检索。问题是将新对象存储到 Event table.
Schema.sql
CREATE TABLE tag (
tag_id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
label VARCHAR(25)
);
CREATE TABLE event (
event_id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
owner_id INTEGER NOT NULL,
place_id INTEGER NOT NULL,
content TEXT,
thumbnail VARCHAR(100),
heading VARCHAR(50),
date_added DATE,
start_date DATE,
start_time TIME,
end_date DATE,
end_time TIME,
approved BOOL,
FOREIGN KEY (owner_id) REFERENCES user (user_id),
FOREIGN KEY (place_id) REFERENCES place (place_id)
);
CREATE TABLE event_tag (
event_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (event_id,tag_id),
KEY fk_event (event_id),
KEY fk_tag (tag_id),
CONSTRAINT fk_tag FOREIGN KEY (tag_id) REFERENCES tag (tag_id),
CONSTRAINT fk_event FOREIGN KEY (event_id) REFERENCES event (event_id)
)
Event.java
@Entity
@Getter
@Setter
@EqualsAndHashCode
@Table(name = "event")
public class Event implements Serializable {
@Id
@GeneratedValue
@Column(name = "event_id")
protected Long id;
...
//todo: not working while saving
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(
name = "event_tag",
joinColumns = @JoinColumn(name = "event_id"),
inverseJoinColumns = @JoinColumn(name = "tag_id")
)
private Set<Tag> tags;
...
}
Tag.java
@Entity
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode
@Table(name = "tag")
public class Tag implements Serializable {
@Id
@GeneratedValue
@Column(name = "tag_id")
private Long id;
@Column(name = "label")
private String label;
}
然后这就是我在服务中存储事件的方式
EventService.java
public Optional<Event> create(Event event) {
try {
entityManager.unwrap(Session.class).save(event);
} catch (Exception e) {
e.printStackTrace();
}
return Optional.ofNullable(event);
}
此时标签和事件之间的关系存在于事件对象中
我从来没有收到任何错误。在会话保存对象后,加入 table 保持不变。事件 table 使用新存储的对象进行扩展。
还有我的application.properties:
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.h2.console.enabled=true
我错过了什么?任何帮助表示赞赏。谢谢!
保存后不执行 flush(),因此不会生成 SQL 语句。
调用 flush() 或确保 create() 在事务上下文中执行。
我正在尝试使用 Spring Boot、JPA、QueryDsl 和内存 H2 数据库实现单向一对多映射。当我通过 schema.sql 插入数据时,文件关系被正确检索。问题是将新对象存储到 Event table.
Schema.sql
CREATE TABLE tag (
tag_id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
label VARCHAR(25)
);
CREATE TABLE event (
event_id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
owner_id INTEGER NOT NULL,
place_id INTEGER NOT NULL,
content TEXT,
thumbnail VARCHAR(100),
heading VARCHAR(50),
date_added DATE,
start_date DATE,
start_time TIME,
end_date DATE,
end_time TIME,
approved BOOL,
FOREIGN KEY (owner_id) REFERENCES user (user_id),
FOREIGN KEY (place_id) REFERENCES place (place_id)
);
CREATE TABLE event_tag (
event_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (event_id,tag_id),
KEY fk_event (event_id),
KEY fk_tag (tag_id),
CONSTRAINT fk_tag FOREIGN KEY (tag_id) REFERENCES tag (tag_id),
CONSTRAINT fk_event FOREIGN KEY (event_id) REFERENCES event (event_id)
)
Event.java
@Entity
@Getter
@Setter
@EqualsAndHashCode
@Table(name = "event")
public class Event implements Serializable {
@Id
@GeneratedValue
@Column(name = "event_id")
protected Long id;
...
//todo: not working while saving
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(
name = "event_tag",
joinColumns = @JoinColumn(name = "event_id"),
inverseJoinColumns = @JoinColumn(name = "tag_id")
)
private Set<Tag> tags;
...
}
Tag.java
@Entity
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode
@Table(name = "tag")
public class Tag implements Serializable {
@Id
@GeneratedValue
@Column(name = "tag_id")
private Long id;
@Column(name = "label")
private String label;
}
然后这就是我在服务中存储事件的方式 EventService.java
public Optional<Event> create(Event event) {
try {
entityManager.unwrap(Session.class).save(event);
} catch (Exception e) {
e.printStackTrace();
}
return Optional.ofNullable(event);
}
此时标签和事件之间的关系存在于事件对象中
我从来没有收到任何错误。在会话保存对象后,加入 table 保持不变。事件 table 使用新存储的对象进行扩展。
还有我的application.properties:
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.h2.console.enabled=true
我错过了什么?任何帮助表示赞赏。谢谢!
保存后不执行 flush(),因此不会生成 SQL 语句。
调用 flush() 或确保 create() 在事务上下文中执行。