为什么@Column可能无法用于方法?

时间:2017-08-09 09:55:07

标签: java postgresql hibernate jpa annotations

我有一个带有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() {
    }
}

但是我收到以下结构:

enter image description here

忽略方法的所有注释

有谁能请给我一些建议,为什么会发生这种情况以及如何正确创建所需的字段?

2 个答案:

答案 0 :(得分:1)

方法必须遵循,Java Bean约定;确切地说,公开 GettersSetters。移动,属性必须存在。试试这个,

@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() {
    }
}