Hibernate @OneToMany 注释似乎不起作用

问题描述 投票:0回答:1

我正在尝试获取包含“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。我已经包含了一些表格之间的数据和连接图片。

spring spring-boot hibernate one-to-many hibernate-onetomany
1个回答
0
投票

你的“文件”属性应该是空的,因为你这样定义它:

fetch = FetchType.LAZY

然后,如果您在检索到的票证上调用

getFiles
,它将获取文件。

© www.soinside.com 2019 - 2024. All rights reserved.