【发布时间】:2017-10-15 01:59:58
【问题描述】:
我在学习Spring,Hibernate
我已阅读以下和其他教程资源。
我的理解是@Transient 会阻止对象字段序列化并阻止它持久化到数据库中。
JPA Transient annotation and JSON
我的问题是,如果您有一个对象的字段,但您不想保留到数据库,但又希望在从服务器获取数据时检索该字段,该怎么办?
例如,在您的 MySql createDate 设置为 CURRENT_TIMESTAMP 时,当插入数据时,我的 MySql 会创建 TIMESTAMP。
MySql 是这样设置的
ALTER TABLE `books`
ADD COLUMN `dateCreated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON
UPDATE CURRENT_TIMESTAMP AFTER `dateCreated`;
我的控制器是
@RequestMapping(path="/booklist", method = RequestMethod.GET, produces="application/json")
@ResponseBody
public Map<String, Object> getListBooks(@RequestParam(name="search", required=false) String search,
@RequestParam(name="ordering", required=false) String ordering){
Map<String, Object> data = new HashMap<String, Object>();
// Get list of books from server
List<Book> books = bookDao.getBookList(search, ordering);
System.out.println(books.get(0));
// do other things and return map
}
我的返回数据是
Book [id=1, name=Murach Jquery, 2rd Edition, ispn=978-1890774912, price=4.24, dateCreated=null, datePublished=null]
我的书对象如下
@Entity
@Table(name="books")
@Component
public class Book implements Serializable{
private static final long serialVersionUID = -2042607611480064259L;
@Id
@GeneratedValue
private int id;
@NotBlank
private String name;
@NotBlank
@Size(min=2, max=16)
private String ispn;
@DecimalMin(value = "0.1")
private double price;
@Transient
private Timestamp dateCreated;
private Date datePublished;
// getter and setters
}
谢谢。
【问题讨论】:
-
@Transient属性不会持久化到数据库中,而只会添加到 JSON 响应中。您可能需要在dateCreated属性上添加@Temporal注释。 -
你关心的只是
createDate吗? -
如果你没有持久化它,你会从哪里检索它。一旦会话关闭,任何不持久的东西都会消失。
-
@AbdullahKhan 是的,所有其他字段都非常正常,发送到 db 并从 db 获取是正常的,只是
dateCreated有点令人困惑,因为日期是由 MySql 设置的,而不是在应用程序端。还是您认为我设置的方式不合逻辑,应该在应用程序上创建日期。 -
@Mohit 我已经用 MySql 中的表格代码更新了我的问题。 MySql 将在插入数据时创建一个 TIMESTAMP。所以我的控制器将调用
bookDao.getBookList()来检索书籍对象。
标签: java spring hibernate jpa jackson