Я строю свой собственный проект и столкнулся с проблемой, которую я почему-то не могу решить. Когда я удаляю, например, Company, я также вижу это в базе данных. Мой тестовый пример успешно пройден.
Но проблема в том, что когда я хочу удалить билет, он просто не удаляется. Единственный случай, когда он удаляется, это когда я использую fooRepository.deleteAll ();
Пользователь
@Getter
@Setter
@Entity
@Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"username"})})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Size(min = 3, max = 32)
private String username;
@Size(max = 256)
private String password;
@Size(min = 3, max = 32)
private String firstName;
@Size(min = 3, max = 32)
private String lastName;
@Size(min = 5, max = 64)
private String email;
@JsonIgnoreProperties("user")
@OneToMany(
fetch = FetchType.EAGER,
mappedBy = "user",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Ticket> tickets;
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(
name = "role_id",
insertable = false,
updatable = false,
columnDefinition = "INT DEFAULT 1"
)
private Role role;
@Column(columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
private Timestamp timeRegistered;
}
Билет
@Getter
@Setter
@Entity
@Table(name = "ticket")
public class Ticket {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@JsonIgnoreProperties("tickets")
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "user_id")
private User user;
@JsonIgnoreProperties("ticket")
@OneToMany(
fetch = FetchType.EAGER,
mappedBy = "ticket",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<TicketItem> ticketItems;
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "company_id")
private Company company;
@Column(
columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP",
insertable = false,
updatable = false
)
private Timestamp timeCreated;
}
TicketItem
@Getter
@Setter
@Entity
@Table(name = "ticket_item", uniqueConstraints = {@UniqueConstraint(columnNames = {"price_id"})})
public class TicketItem {
@EmbeddedId
private TicketItemPk id;
@JsonIgnoreProperties("ticketItems")
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(
name = "ticket_id",
insertable = false,
updatable = false
)
private Ticket ticket;
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(
name = "item_id",
insertable = false,
updatable = false
)
private Item item;
@Positive
@Column(name = "item_count")
private Integer count;
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "price_id")
private Price price;
}
Компания
@Data
@Entity
@Table(name = "company", uniqueConstraints = {@UniqueConstraint(columnNames = {"name"})})
public class Company {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Size(min = 1, max = 64)
private String name;
}
Пункт
@Data
@Entity
@Table(name = "item", uniqueConstraints = {@UniqueConstraint(columnNames = {"name"})})
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Size(min = 2, max = 64)
private String name;
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(
name = "type_id",
insertable = false,
updatable = false
)
private ItemType type;
}
Может быть, поможет показ модульного теста, поэтому я опубликую его здесь. Я также выложу здесь application.test-properties.
application.test-свойства
spring.application.name=Homeconomy Testing Application
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/homeconomy_testdb?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=****
spring.datasource.password=****
spring.datasource.initialization-mode=always
spring.jpa.show-sql=true
spring.jpa.open-in-view=false
spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.output.ansi.enabled=ALWAYS
server.port=8080
TestConfig
@Ignore
@SpringBootTest
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = HEcoAppBoot.class)
public abstract class TestConfig {
}
RepositoryTestConfig
@ActiveProfiles("test")
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public abstract class RepositoryTestConfig extends TestConfig {
}
TicketRepositoryTest
public class TicketRepositoryTest extends RepositoryTestConfig {
@Autowired
private TicketRepository repository;
@Autowired
private UserRepository userRepository;
@Autowired
private CompanyRepository companyRepository;
@Test
public void CRUD() {
User user = userRepository.findAll().get(0);
Company company = new Company();
company.setName("TEST TICKET COMPANY");
companyRepository.saveAndFlush(company);
company = companyRepository.findByName(company.getName());
List<Ticket> tickets = repository.findAll();
Ticket insertTicket = new Ticket();
insertTicket.setUser(user);
insertTicket.setCompany(company);
repository.saveAndFlush(insertTicket);
List<Ticket> ticketsAfterInsert = repository.findAll();
Ticket ticket = ticketsAfterInsert.get(ticketsAfterInsert.size() - 1);
assertThat(ticket).isNotNull();
assertThat(ticketsAfterInsert.size()).isGreaterThan(tickets.size());
repository.deleteAll(ticketsAfterInsert);
repository.flush();
List<Ticket> ticketsAfterDelete = repository.findAll();
assertThat(ticketsAfterInsert.size()).isGreaterThan(ticketsAfterDelete.size());
}
}
Неудачная часть моего теста -
assertThat(ticketsAfterInsert.size()).isGreaterThan(ticketsAfterDelete.size());
из-за того, что объекты не удаляются из базы данных. Если что-то не так с моим вопросом, пожалуйста, дайте мне знать. Я буду рад за любую помощь. Я действительно пробовал много решений, которые нашел здесь или в другом месте, но у меня ничего не получалось.