在 Hibernate 中遇到外键问题

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

我有 2 张桌子,房间和客人

@Entity
@Table(name = "rooms")
public class Room
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String type;
private String image;
private double price;
@Column(columnDefinition = "TEXT")
private String description;

    @OneToOne
    @JoinColumn(name = "guest_id", referencedColumnName = "id")
    private Guest guest;`
@Entity
@Table(name = "guests")
public class Guest
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private String phone_num;
    private String email;
    private LocalDate check_in_date;
    private LocalDate check_out_date;

    @OneToOne(mappedBy = "guest", cascade = CascadeType.ALL)
    private Room room;

我正在尝试使用 Hibernate 在 Room 表中创建外键,该表应该引用我的 Guest 表中的“id”字段。我还尝试使用 Bootstrap 在表格中显示我的 Room 表的内容

<td th:text = "${room.guest_id}"></td>

但是我遇到了这个问题:

org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'guest_id' cannot be found on object of type 'com.example.hotel.Room.Room' - maybe not public or not valid?

如果需要的话,这也是我的房间控制器:

@Controller
@RequestMapping("/rooms")
public class RoomController
{
    @Autowired
    private RoomRepository roomRepository;

    @GetMapping("/")
    public String showRooms(Model model)
    {
        List<Room> rooms = roomRepository.findAll();
        model.addAttribute("rooms", rooms);

        return "rooms";
    }
}

我尝试创建外键的方式或我拥有的控制器有问题吗?提前非常感谢!

java spring-boot hibernate hibernate-mapping
1个回答
0
投票

你的模型有点错误:

@JoinColumn(name = "guest_id", referencedColumnName = "id")
private Guest guest;`

您不需要这里的

referencedColumnName = "id"

并且您将数据库属性与 java 属性混合在一起:

<td th:text = "${room.guest_id}"></td>

你必须写:

<td th:text = "${room.guest.id}"></td>

JPA 注释(

@JoinColumn
等)只是引用数据库中的表并编写正确的 SQL:您可以省略它们并让您的 JPA 实现(hibernate)使用一些默认值,除非您已经有数据库或除非你对名字有限制(或形式主义)。

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