我有 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";
}
}
我尝试创建外键的方式或我拥有的控制器有问题吗?提前非常感谢!
你的模型有点错误:
@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)使用一些默认值,除非您已经有数据库或除非你对名字有限制(或形式主义)。