我有一个带有JPA和Hibernate Maven依赖项的Spring Boot应用程序。数据库是PosgreSQL。
我想根据方法在数据库中创建字段。
所以我有一个实体类:
@Entity
@Table(name="test_my_entity")
public class MyEntity {
@Id
@GeneratedValue
private Long id;
protected String name;
@Transient
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar myXMLDate;
protected Calendar myDateProperty;
@Column(name = "my_date")
private Calendar isCalendar() {
return new GregorianCalendar(myXMLDate.getYear(), myXMLDate.getMonth(), myXMLDate.getDay());
}
@Column(name = "my_str")
public String myStr() {
return "My string";
}
public MyEntity() {
}
}
但是我收到以下结构:
忽略方法的所有注释。
有谁能请给我一些建议,为什么会发生这种情况以及如何正确创建所需的字段?
答案 0 :(得分:1)
方法必须遵循,Java Bean约定;确切地说,公开 Getters
和Setters
。移动,属性必须存在。试试这个,
@Entity
@Table(name="test_my_entity")
public class MyEntity {
private Long id;
protected String name;
private Calendar myDate;
private String myStr;
@Transient
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar myXMLDate;
@Id
@GeneratedValue
public Long getId() {
return id;
}
@Column(name = "my_date")
public Calendar getMyDate() {
return myDate;
}
@Column(name = "my_str")
public String getMyStr() {
return myStr;
}
// I don't get its purpose; hence not touching it.
private Calendar isCalendar() {
return new GregorianCalendar(myXMLDate.getYear(), myXMLDate.getMonth(), myXMLDate.getDay());
}
}
参考文献:
答案 1 :(得分:0)
所以我找到了解决方案。为了能够从方法接收值,您应该添加 @Access 注释,并制作 @Transient 变量。
因此,Hibernate将创建必要的字段,并且在提交期间使用方法中的值来实现。
此处还有一个如何将XMLGregorianCalendar转换为日历的示例 - Hibernate可以成功使用的格式。
这是一个有效的例子:
@Entity
@Access(AccessType.FIELD)
@Table(name="test_my_entity")
public class MyEntity {
@Id
@GeneratedValue
private Long id;
@XmlAttribute(name = "name")
@Transient
protected String name;
@XmlSchemaType(name = "dateTime")
@Transient
protected XMLGregorianCalendar myXMLDate;
@Transient
private Calendar calendarDate;
@Access(AccessType.PROPERTY)
@Column(name = "calendar_date")
private Calendar getCalendarDate() {
return new GregorianCalendar(myXMLDate.getYear(), myXMLDate.getMonth(), myXMLDate.getDay());
}
@Access(AccessType.PROPERTY)
@Column(name = "my_str_name")
public String getName() {
return "My string";
}
//...setters here
public MyEntity() {
}
}