我正在尝试获取包含“FileData”的“Ticket”实体,但我无法让它工作,而且我完全不知道为什么。其他人的代码似乎与我自己的代码一样工作得很好。但是每当我获取它时,无论如何,我的“票证”对象的“文件”列都会返回空的。
(是的,数据库中有它的数据,因此给定 ID 的关联列不为空或类似的内容)
我的 BaseEntity 类包括 @Id 注释,以及创建日期、修改日期、用户创建日期等
门票实体:
package com.issue.tracker.ticket;
import com.issue.tracker.common.BaseEntity;
import com.issue.tracker.filesystem.FileData;
import com.issue.tracker.project.Project;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.HashSet;
import java.util.Set;
@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "tickets")
public class Ticket extends BaseEntity {
@NotEmpty
private String issueName;
@NotEmpty
private String description;
@ManyToOne
@JoinColumn(name="project_id", nullable=false)
private Project project;
//This is supposed to work but for some reason it doesn't seem to
@OneToMany(mappedBy = "ticket", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private Set<FileData> files = new HashSet<>();
}
文件数据实体:
package com.issue.tracker.filesystem;
import com.issue.tracker.common.BaseEntity;
import com.issue.tracker.ticket.Ticket;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "file_datas")
@AllArgsConstructor
@NoArgsConstructor
public class FileData extends BaseEntity {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="ticket_id", nullable=false)
private Ticket ticket;
@NotEmpty
private String filePath;
@NotEmpty
private String fileName;
@NotEmpty
private String fileType;
@NotNull
private Long fileSize;
}
TicketRepository:
package com.issue.tracker.ticket;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface TicketRepository extends JpaRepository<Ticket, Long> {
List<Ticket> findAllByCreatedBy(String username);
}
TicketServiceImpl(包括注释掉的部分,我得到一个空的“文件”列):
package com.issue.tracker.ticket;
import com.issue.tracker.common.RollbackOnException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Optional;
@Slf4j
@RequiredArgsConstructor
@Service
public class TicketServiceImpl implements TicketService {
private final TicketRepository ticketRepository;
@RollbackOnException
@Override
public Ticket createTicket(Ticket ticket) {
return ticketRepository.save(ticket);
}
@Override
public List<Ticket> getAllTicketsByName(String username) {
return ticketRepository.findAllByCreatedBy(username);
}
@Override
public List<Ticket> getAllTickets() {
return ticketRepository.findAll();
}
@Override
public Ticket getTicketById(Long id) {
Ticket ticket = ticketRepository.findById(id).orElseThrow(() -> new NoSuchElementException("Ticket not found"));
log.info(ticket.toString());
//this is what I get here, note that "files" is empty:
//Ticket(issueName=AAAAAAAAAA...
//description=ahdfjduafadjfhadjfhadjfhadjfhadjlfhadjfadjfhad,
//project=Project(projectName=Webshop), files=[])
return ticket;
}
}
我很好奇 SQL 日志,这是后台发生的休眠魔法:
select
t1_0.id,
t1_0.created_at,
t1_0.created_by,
t1_0.description,
t1_0.issue_name,
t1_0.modified_by,
p1_0.id,
p1_0.created_at,
p1_0.created_by,
p1_0.modified_by,
p1_0.project_name,
p1_0.updated_at,
t1_0.updated_at
from tickets t1_0 join projects p1_0 on p1_0.id=t1_0.project_id
where t1_0.id=?
select f1_0.ticket_id,
f1_0.id,
f1_0.created_at,
f1_0.created_by,
f1_0.file_name,
f1_0.file_path,
f1_0.file_size,
f1_0.file_type,
f1_0.modified_by,
f1_0.updated_at
from file_datas f1_0
where f1_0.ticket_id=?
select f1_0.ticket_id,
f1_0.id,
f1_0.created_at,
f1_0.created_by,
f1_0.file_name,
f1_0.file_path,
f1_0.file_size,
f1_0.file_type,
f1_0.modified_by,
f1_0.updated_at
from file_datas f1_0
where f1_0.ticket_id=?
我的 file_datas 部分被分别调用了两次。我猜了两次,因为有两行对应给定的 ticket_id。我已经包含了一些表格之间的数据和连接图片。
你的“文件”属性应该是空的,因为你这样定义它:
fetch = FetchType.LAZY
然后,如果您在检索到的票证上调用
getFiles
,它将获取文件。