关于java:日期被覆盖(Spring / Hibernate)

Date gets overwritten (Spring/Hibernate)

现在我的主页上有一个"预订"表,显示不同预订的信息。其中一个字段是"预订日期",显示创建预订的日期和时间。但当我编辑预订时,它会自动被新日期覆盖。我该如何防止这种情况发生?

我的预订课

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
@Entity
@Table(name="booking")
public class Booking {

    @Id
    @Column(name="id")
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name="R_id")
    private Restaurant restaurant;

    @Column(name="date")
    @Temporal(TemporalType.DATE)
    private Date date;

    @Column(name="start")
    private String start;

    @Column(name="duration")
    private float duration;

    @Column(name="amount_of_people")
    private int amountOfPeople;

    @Column(name="name")
    private String name;

    @Column(name="contact_preference")
    private String contactPreference;

    @Column(name="phone_number")
    private String phoneNumber;

    @Column(name="comments")
    private String comments;

    // Date that gets overwritten
    @Column(name="current_datetime")
    @Type(type="timestamp")
    private Date currentDatetime;

    @Column(name="new_date")
    @Type(type="timestamp")
    private Date newDate;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Restaurant getRestaurant() {
        return restaurant;
    }

    public void setRestaurant(Restaurant restaurant) {
        this.restaurant = restaurant;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getStart() {
        return start;
    }

    public void setStart(String start) { this.start = start; }

    public float getDuration() {
        return duration;
    }

    public void setDuration(float duration) {
        this.duration = duration;
    }

    public int getAmountOfPeople() {
        return amountOfPeople;
    }

    public void setAmountOfPeople(int amountOfPeople) {
        this.amountOfPeople = amountOfPeople;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContactPreference() {
        return contactPreference;
    }

    public void setContactPreference(String contactPreference) {
        this.contactPreference = contactPreference;
    }

    public String getPhoneNumber() { return phoneNumber; }

    public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; }

    public String getComments() {
        return comments;
    }

    public void setComments(String comments) {
        this.comments = comments;
    }

    public Date getCurrentDatetime() {
        return currentDatetime;
    }

    public void setCurrentDatetime(Date currentDatetime) { this.currentDatetime = currentDatetime; }

    public Date getNewDate() { return newDate; }

    public void setNewDate(Date newDate) { this.newDate = newDate; }

    // Comparator
    public static class BookingDateComparator implements Comparator<Booking> {
        @Override
        public int compare(Booking booking1, Booking booking2) {
            if (booking1.getDate().compareTo(booking2.getDate()) == 0) {
                return booking1.getStart().compareTo(booking2.getStart());
            }
            return booking1.getDate().compareTo(booking2.getDate());
        }
    }

}

我的主控制器类中的相关方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@RequestMapping(value ="bookings", method = RequestMethod.GET)
public String bookings(Model model) {
    List<Booking> bookingList = bookingService.getBookings();
    model.addAttribute("bookings", bookingList);
    initModelList(model);
    return"bookings";
}
    @RequestMapping(value ="booking/create", method = RequestMethod.GET)
public String createBooking(Model model) {
    model.addAttribute("booking", new Booking());
    initModelList(model);
    return"newBooking";
}

@RequestMapping(value ="booking/create", method = RequestMethod.POST)
public String createBookingAction(@Valid @ModelAttribute ("booking") Booking booking, BindingResult result, Model model) {
    BookingFormValidator bookingFormValidator = new BookingFormValidator();
    bookingFormValidator.validate(booking, result);
    if (result.hasErrors()) {
        initModelList(model);
        return"newBooking";
    }
    bookingService.addBooking(booking);
    return"redirect:/bookings";
}

@RequestMapping(value ="booking/edit/{id}", method = RequestMethod.GET)
public String editBooking(@PathVariable Long id, Model model) {
    initModelList(model);
    Booking booking = bookingService.getBooking(id);
    model.addAttribute("booking", booking);
    return"editBooking";
}

@RequestMapping(value ="booking/edit/{id}", method = RequestMethod.POST)
public String editBookingAction(@Valid @ModelAttribute ("booking") Booking booking, BindingResult result, Model model) {
    BookingFormValidator bookingFormValidator = new BookingFormValidator();
    bookingFormValidator.validate(booking, result);
    if (result.hasErrors()) {
        initModelList(model);
        return"editBooking";
    }
    bookingService.updateBooking(booking);
    return"redirect:/bookings";
}

我主页的.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<body>
<jsp:include page="../fragments/menu.jsp"/>


    <section class="content-wrapper main-content clear-fix">


        List of bookings

        <p>

            Add restaurant
            Create New Booking
       
</p>
        <table class="">
            <tr>
                <th>
                    Booking information
                </th>
                <th></th>
            </tr>

            <c:forEach items="${restaurants}" var="restaurants">
                <tr>
                    <td>${restaurants}</td>
                    <td valign="bottom">Edit restaurant</td>

                    <tr>
                        <table>
                            <col align="left" width="100">
                            <col align="left" width="60">
                            <col align="left" width="60">
                            <col align="left" width="60">
                            <col align="left" width="60">
                            <col align="left" width="90">
                            <col align="left" width="90">
                            <col align="left" width="90">
                            <col align="left" width="100">
                            <col align="left" width="100">
                            <tr>
                                <td align="left">Date</td>
                                <td align="left">Start</td>
                                <td align="left">Duration</td>
                                <td align="left"># Of People</td>
                                <td align="left">Name</td>
                                <td align="left">Contact Pref.</td>
                                <td align="left">Phone #</td>
                                <td align="left">Comments</td>
                                <td align="left">Booking date</td>
                            </tr>
                            <c:forEach items="${sortedBooking}" var="sortedBooking">
                                <c:choose>
                                    <c:when test="${restaurants == sortedBooking.restaurant.restaurantName}">
                                        <tr>
                                            <td>${sortedBooking.date}</td>
                                            <td>${sortedBooking.start}</td>
                                            <td>${sortedBooking.duration}</td>
                                            <td>${sortedBooking.amountOfPeople}</td>
                                            <td>${sortedBooking.name}</td>
                                            <td>${sortedBooking.contactPreference}</td>
                                            <c:choose>
                                                <c:when test="${sortedBooking.phoneNumber.equals('')}">
                                                    <td>NO PHONE</td>
                                                </c:when>
                                                <c:otherwise>
                                                    <td>${sortedBooking.phoneNumber}</td>
                                                </c:otherwise>
                                            </c:choose>
                                            <c:choose>
                                                <c:when test="${sortedBooking.comments.equals('')}">
                                                    <td>NO COMMENTS</td>
                                                </c:when>
                                                <c:otherwise>
                                                    <td>${sortedBooking.comments}</td>
                                                </c:otherwise>
                                            </c:choose>
                                            <td>${sortedBooking.currentDatetime}</td>
                                            <td>Edit booking</td>
                                        </tr>
                                    </c:when>
                                </c:choose>
                            </c:forEach>
                        </table>
                    </tr>
                </tr>
            </c:forEach>
        </table>

    </section>

<jsp:include page="../fragments/footer.jsp"/>

</body>

我的editbooking.jsp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<body>
<jsp:include page="../fragments/menu.jsp"/>

    <section class="content-wrapper main-content clear-fix">

        Edit

        <form:form modelAttribute="booking">
            <table>
                <tr>
                    <td>Restaurant*:</td>
                    <td><form:select path="restaurant.id">
                            <form:option value="" label="--- Select ---" />
                            <form:options items="${restaurants}" itemValue="id" itemLabel="restaurantName" />
                    <td><form:errors path="restaurant.id" cssClass="error"/></td>
                    </form:select>
                </tr>
                <tr>
                    <td>Date*:</td>
                    <td><form:input path="date" type="date"/></td>
                    <td><form:errors path="date" cssClass="error"/></td>
                </tr>
                <tr>
                    <td>Starting time*:</td>
                    <td><form:input path="start" type="time"/></td>
                    <td><form:errors path="start" cssClass="error"/></td>
                </tr>
                <tr>
                    <td>Duration*:</td>
                    <td><form:input path="duration"/></td>
                    <td><form:errors path="duration" cssClass="error"/></td>
                </tr>
                <tr>
                    <td>Amount of people*:</td>
                    <td><form:input path="amountOfPeople"/></td>
                    <td><form:errors path="amountOfPeople" cssClass="error"/></td>
                </tr>
                <tr>
                    <td>Name*:</td>
                    <td><form:input path="name"/></td>
                    <td><form:errors path="name" cssClass="error"/></td>
                </tr>
                <tr>
                    <td>Contact preference*:</td>
                    <td><form:select path="contactPreference">
                            <form:option value="" label="--- Select ---" />
                            <form:option value="e-mail" label="E-mail" />
                            <form:option value="phone" label="Phone" />
                            <form:option value="other" label="Other" />
                    <td><form:errors path="contactPreference" cssClass="error"/></td>
                    </form:select>
                </tr>
                <tr>
                    <td>Phone number:</td>
                    <td><form:input path="phoneNumber"/></td>
                    <td><form:errors path="phoneNumber" cssClass="error"/></td>
                </tr>
                <tr>
                    <td>Comments:</td>
                    <td><form:textarea path="comments" rows="5" cols="30"/></td>
                    <td><form:errors path="comments" cssClass="error"/></td>
                </tr>
                <tr>
                    <td colspan="3"><input type="submit" /></td>
                </tr>
            </table>
        </form:form>
       
            Back to List
       


    </section>

<jsp:include page="../fragments/footer.jsp"/>

</body>

感谢您的帮助!对不起,这封长信。

编辑:我试图更改我的代码以禁用更新,但它仍然不起作用。

1
2
3
@Column(name="current_datetime", updatable=false, nullable=false)
@Type(type="timestamp")
private Date currentDatetime = new Date();


不要使用@Type(type="timestamp")来存储日期。在许多数据库中,时间戳用于跟踪更改,而不是作为应用程序逻辑的普通日期字段。因此,切换到数据库中的datetime并删除@Type注释,因为hibernate已经将Date转换为正确的类型。

另请参见:

  • 我应该使用字段"datetime"还是"timestamp"?
  • 何时使用日期时间或时间戳